如何将多个参数作为变量传递给应用程序?



我需要遍历一个变量并生成多个参数,以便稍后在bash脚本中传递给命令。

的例子:

VAR_FILES="a.json;b.json"
IFS=';'
read -ra ADDR <<< "$VAR_FILES"
CMD_ARGS=""
for i in "${ADDR[@]}"; do
CMD_ARGS="$CMD_ARGS-var-file=$i "
done
terraform plan -input=false $CMD_ARGS -out=test.plan

我希望上面的命令可以与terraform命令一起工作,但是命令将变量作为单个参数读取,如下面的错误消息所示。

user@local:~/test/$ terraform plan -input=false $CMD_ARGS -out=test.plan
╷
│ Error: Failed to read variables file
│
│ Given variables file "a.json" -var-file="b.json"  does not exist.
╵

它成功地读取了开头的-var-file=和第一个文件名,但随后将变量的其余部分作为第一个-var-file参数的一部分读取。

IFS=';'更改了脚本其余部分的字段间分隔符,这会使单词拆分变得混乱。如果您将它添加到read调用,那么它将只对该命令有效。

您也可以使用数组来正确存储多个单词,从而完全避免单词拆分。

var_files="a.json;b.json"
IFS=';' read -ra addrs <<< "$var_files"
cmd_args=()
for addr in "${addrs[@]}"; do
cmd_args+=(-var-file="$addr")
done
terraform plan -input=false "${cmd_args[@]}" -out=test.plan

我还将所有变量名转换为小写。所有大写名称都为shell保留。您自己的变量最好使用小写,以免与内置变量冲突。

您正在更改IFS,而没有将其设置回原始值:

VAR_FILES="a.json;b.json"
OLD_IFS=${IFS}
IFS=';'
read -ra ADDR <<< "$VAR_FILES"
CMD_ARGS=""
for i in "${ADDR[@]}"; do
CMD_ARGS="$CMD_ARGS-var-file=$i "
done
IFS=${OLD_IFS}
terraform plan -input=false ${CMD_ARGS} -out=test.plan