bash 在扩展变量中添加撇号

bash 在扩展变量中添加撇号

我正在 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}\""

不过它符合我的需求,但感觉很脏。欢迎更好的解决方案。

相关内容