我正在 bash 脚本中读取一个文件,其中每行由多列组成,如下所示:
ANSIBLE 'first run' '--diff --extra-vars "client=yes fast=no"'
正如您所看到的,该行由三列组成,其中撇号中有空格。第三列包含供二进制文件调用的选项。当我读取文件时,我将这些选项存储到一个变量中:
custom_options=${columns[2]}
这评估为
custom_options='--diff --extra-vars "client=yes fast=no"'
现在我想使用这些选项执行我的二进制文件:
ansible-playbook $custom_options site.yml
然而这会失败,因为在执行时在内部字符串周围添加了撇号:
ansible-playbook --diff --extra-vars '"client=yes fast=no"' site.yml
有谁知道如何按原样替换变量字符串?
这是一个快速重现该行为的简短脚本:
#!/bin/bash
set -x
touch "as is"
command='-name "as is"'
find . $command -type f
答案1
我找到了解决方法而不是解决方案。我用表达式内的变量包围了整个命令eval
:
eval "ansible-playbook $custom_options site.yml"
这里是示例脚本中的等效用法:
...
eval "find . $command -type f"
我不是 bash 专家,我不知道这个解决方法是否有任何副作用。尽管如此,我测试了以下内容:
- eval 适用于管道:
eval "command | tee file"
- eval 内的引号是可能的:
eval "command \"${var}\""
不过它符合我的需求,但感觉很脏。欢迎更好的解决方案。