在命令执行中列出插值

时间:2016-05-19 13:38:32

标签: bash

我有这个代码接受一个参数列表“a = b c = d e = f”

vars="--extra-vars \"$@\""
echo $vars
ansible-playbook play.yml -c local $vars

目的是var将包含

--extra vars "a=b c=d e=f"

然后像这样调用ls命令

ansible-playbook play.yml -c local --extra-vars "a=b c=d e=f"

执行命令时发生的实际是:

--extra-vars '"a=b' c=d 'e=f"'

如何修复插值?

1 个答案:

答案 0 :(得分:1)

shell在参数扩展后执行分词。参数扩展产生的引号代表自己,因此不会阻止分裂。

如果您绝对必须以这种方式解决问题,那么您可以考虑使用eval从头开始重新解析扩展命令:

vars="--extra-vars '$@'"
echo $vars
eval "ansible-playbook play.yml -c local $vars"

请注意,我已针对额外参数值更改为单引号,以便针对恶意输入提供更大(但仍未完整)的保护;事实证明它也更清晰了。

但是,如果可以这样做,那么最好避免使用eval。如果您再接受更多重组,那么您可以尝试这样的事情:

ansible-playbook play.yml -c local --extra-vars "$*"

$@$*之间的主要区别在于它们如何与分词交互:当在双引号内展开时,前者会扩展为每个位置参数作为单独的单词(并且不会进一步分裂) )后者扩展为包含所有位置参数的单个单词,由$IFS的第一个字符(通常是空格)分隔。