我需要遍历一个变量并生成多个参数,以便稍后在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