【发布时间】:2018-10-24 19:24:27
【问题描述】:
好的,我正在用 bash 编写一个脚本,用于云代工厂向组织添加服务。
作为要求的一部分,用户需要能够将服务作为参数传递。 CF 中的 create service 命令采用 3 个参数,即服务名称、计划、自定义名称。
arg 像 -a "servicename planname customname, nextservice nextplan nextname" 一样传入
我在想,为了对此进行双重解析,我必须这样做
-a "服务名称;计划名称;自定义名称,下一个服务;下一个计划;下一个名称"
然后我们调用命令添加 cf create-service servicename planname customname
或者如果名称中有空格
cf create-service "servicename" "planname" "customname"
话虽如此,我的脚本工作得很好,您可以提供任意数量的服务,以逗号分隔。但我遇到的问题是我的组织中有一项服务,在服务名称中有一个空格,在计划名称中有一个空格。
所以我一直试图弄清楚如何构建我的函数来解析字符串以构建命令。我有一种感觉,我需要 2 个不同的 for 循环,一个会解析出整个字符串前逗号,然后是第二个 for 循环来构建命令,如果在 args 中找到任何空格,则将它们用引号括起来。
这就是我目前所拥有的
add_service() {
if [ -n "${ADDSERVICEID}" ]
then
if [ "${ADDSERVICEID}" == "default" ]
then
....Our Default services are here
echo "The following services are now enabled in your organization"
cf services
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
fi
}
我基本上将 else 部分作为我的默认部分,因为它们都是静态工作。我敢肯定我可能想多了,答案可能正盯着我看,但我只是遇到了一个问题。此外,更改服务名称或计划不包含空格也不是我们的选择。
感谢大家的帮助,我希望一旦我们对此有答案,它将帮助其他人。
更新:好的,现在可以正常工作了。我可以在服务名称中添加空格。太好了。
但是,现在如果我给它提供多个服务来添加它,只需在一个语句中将它们全部拼凑在一起,而不是在 , 上进行解析,
这是更新的代码
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 开始粘贴
更新:呃,你必须删除一些引号,难怪它会将它们全部作为一个字符串来提取。唉,我想该睡觉了
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}
done
done
echo "The following services are now enabled in your organization"
cf services
fi
这现在可以正常工作了,它接受 args,如果其中有空格,我们将 arg 用引号括起来,我们在 , 和 ; 上解析它所以它现在就像一个冠军。
【问题讨论】:
-
添加一个shebang,然后将您的脚本粘贴到那里:shellcheck.net
标签: arrays bash loops parsing arguments