首页 > 解决方案 > 如何将多个参数作为变量传递给应用程序?

问题描述

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

标签: bashshellterraform

解决方案


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。最好为您自己的变量使用小写,以免与内置变量发生冲突。


推荐阅读