我有这个命令,我想改变它。特别是我希望最新的参数存在取决于环境变量。
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"')
当我设置环境变量并使用echo
before 运行该命令来检查输出时,它与我的原始命令完全相同。然而,当我运行它时,参数似乎没有被传递,这让我相信在命令替换中没有评估环境变量。
为什么我的代码不起作用以及如何修复它?
答案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} 以及引用或不引用
也可以看看我们如何运行存储在变量中的命令?
注意:数组需要bash
、ksh
、zsh
或其他支持它们的 shell。 POSIX sh
(例如ash
/ dash
)没有。