命令替换不适用于环境变量

命令替换不适用于环境变量

我有这个命令,我想改变它。特别是我希望最新的参数存在取决于环境变量。

ansible-playbook --inventory inventories/ssg-dev deploy.yml --vault-id dev@~/ansible-password --skip-tags "clear-data"

这是我的尝试:

ansible-playbook --inventory inventories/ssg-$ENVIRONMENT deploy.yml --vault-id $ENVIRONMENT@~/ansible-password $( [ $DATA_SCHEMAS_MIGRATION == true ] && echo ' --skip-tags "clear-data"')

当我设置环境变量并使用echobefore 运行该命令来检查输出时,它与我的原始命令完全相同。然而,当我运行它时,参数似乎没有被传递,这让我相信在命令替换中没有评估环境变量。

为什么我的代码不起作用以及如何修复它?

答案1

clear-data由于单引号,因此不会评估周围的双引号。它导致争论"clear-data"并不clear-data像你所期望的那样。

试试这个:

ansible-playbook --inventory "inventories/ssg-$ENVIRONMENT" deploy.yml --vault-id "$ENVIRONMENT@~/ansible-password" $([ "$DATA_SCHEMAS_MIGRATION" = true ] && echo '--skip-tags clear-data')

请注意,我还在您使用的位置添加了双引号$ENVIRONMENT$DATA_SCHEMAS_MIGRATION以防止通配和分词。

答案2

从变量构造命令行时最好使用数组。它消除了几乎所有与使用和组合单引号、双引号和无引号变量相关的分词问题和其他麻烦,而您在尝试使用标量变量时会遇到这些麻烦。

使用数组还可以使代码更清晰、更易读、更容易修改(而不是尝试修改带有大量参数和条件的长而复杂的行,您可以将其分成多行,每行添加一个或更多参数)

只需构建一个包含要与命令一起使用的所有参数的数组(您可以一次执行所有操作,也可以使用 附加执行此操作+=,甚至根据需要使用条件和/或循环),然后使用数组的所有元素执行命令作为一个论点。

例如:

ap_args=(--inventory "inventories/ssg-$ENVIRONMENT" deploy.yml)
ap_args+=(--vault-id "$ENVIRONMENT@~/ansible-password")
[ "$DATA_SCHEMAS_MIGRATION" == true ] && ap_args+=(--skip-tags clear-data)

ansible-playbook "${ap_args[@]}"

另外,请记住引用您的变量。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?$VAR 与 ${VAR} 以及引用或不引用

也可以看看我们如何运行存储在变量中的命令?

注意:数组需要bashkshzsh或其他支持它们的 shell。 POSIX sh(例如ash/ dash)没有。

相关内容