Bash脚本实现Cloud Foundry带空格多服务添加方案
实现Cloud Foundry批量添加服务的Bash脚本
我最近在开发一个Bash脚本,用于给Cloud Foundry组织批量添加服务,核心需求是让用户通过命令行参数传入服务信息。Cloud Foundry的cf create-service命令需要三个必填参数:服务名称、套餐名称、自定义服务实例名,所以得先搞定参数的解析逻辑。
参数格式的调整
一开始用户传入参数的格式是这样的:
-a "servicename planname customname, nextservice nextplan nextname"
但这种格式没法区分单个服务内部的三个参数和多个服务之间的分隔,很容易解析出错。所以我把参数格式调整为:用分号分隔单个服务的三个参数,用逗号分隔不同的服务,比如:
-a "servicename; planname; customname, nextservice; nextplan; nextname"
另外还有个细节:如果服务名或套餐名包含空格,必须用引号包裹参数,比如:
cf create-service "My Awesome Service" "Enterprise Plan" "my-service-01"
无空格的参数则直接使用即可:
cf create-service redis basic redis-instance-01
开发过程中的踩坑与迭代
第一版:未处理多服务拆分与空格参数
最开始的代码尝试处理用户自定义服务,但既没法正确拆分多个服务,也没给含空格的参数加引号,逻辑很混乱:
else IFS="," for i in "${ADDSERVICEID[@]}"; do if [[ $i =~ \ ]]; then $i=\"$i\" fi for i in "${FULLSERVICE[@]}"; do $i echo "The following services are now enabled in your organization" cf services done done fi
第二版:处理空格参数但多服务拆分失败
后来调整了代码,能给含空格的参数加上引号,但多服务始终没法按逗号正确拆分,导致命令执行出错:
else IFS="," for arg1 in "${ADDSERVICEID[@]}"; do IFS=";" CREATESERVICE="" for arg2 in "${arg1[@]}"; do if [[ $arg2 =~ \ ]] then $arg2=\'\"$arg2\"\' fi CREATESERVICE+="${arg2}" echo ${CREATESERVICE} cf create-service ${CREATESERVICE} echo "The following services are now enabled in your organization" cf services done done fi
最终可行代码
经过反复调试,我移除了多余的引号嵌套,修正了循环中的变量处理逻辑,最终代码可以完美实现需求:
else IFS=, # 外层循环:按逗号拆分多个服务 for arg1 in ${ADDSERVICEID[@]}; do IFS=";" CREATESERVICE="" # 内层循环:按分号拆分单个服务的三个参数 for arg2 in ${arg1}; do # 判断参数是否包含空格,是则添加双引号 if [[ $arg2 =~ [[:space:]] ]]; then arg2=\"$arg2\" fi # 拼接参数,注意加空格分隔 CREATESERVICE+=" ${arg2}" done # 移除命令开头多余的空格 CREATESERVICE=$(echo "$CREATESERVICE" | sed 's/^ //') echo "Executing: cf create-service ${CREATESERVICE}" # 执行CF命令 cf create-service ${CREATESERVICE} done # 输出当前组织的服务列表 echo "The following services are now enabled in your organization" cf services fi
关键实现要点
- 双重循环解析:外层循环用逗号分隔多个服务,内层循环用分号拆分单个服务的三个参数,确保每个服务的参数都能正确提取。
- 空格参数处理:通过正则表达式
[[:space:]]判断参数是否包含空格,自动给参数添加双引号,避免命令执行时的语法错误。 - 命令拼接优化:拼接参数时添加空格分隔,最后用sed移除开头的多余空格,保证命令格式完全符合CF的要求。
内容的提问来源于stack exchange,提问作者TheFuzz4
相关产品推荐
相关产品推荐

