Bash:将变量内容作为参数插入命令替换 - 如何正确引用?

时间:2016-12-28 19:56:49

标签: bash command-substitution variable-subsitution

我真的找不到解决这个问题的方法: 假设我有一个有多行的变量,每一行最后应该是一个参数。

line   1
line two
...

我只在运行时获取这些数据,但它应该像这样构建一个命令:

answer="$(dialog --menu 'Menu title' 0 0 0 'line   1' - 'line two' - ... 3>&1 1>&2 2>&3)"

(数据必须用 - 分隔 - 但这不是问题。)

我认为我真的尝试了所有可能的组合,但它无法解决。我已经检查了这个网站,但我>认为<它不能解决我的问题:http://mywiki.wooledge.org/BashFAQ/050

我应该尝试切换分词吗?

这是我现在的代码:

list=""
while read p; do
    list="$list '$p' - "
done <<< $line_separated_input

answer="$(dialog --menu 'Chosse sth' 0 0 0 $list 3>&1 1>&2 2>&3)"

使用数组也不起作用(如(5)中所述:https://superuser.com/a/360986):(如何在引用的内容中停止分词,即使由于变量替换而插入引用的内容?

编辑:谢谢大家,引用$line_separated_input是解决方案的一部分。将它与数组列表一起使用而不是变量最终解决了我的问题。 你可以自己检查,有一个额外的命令替换使事情变得更难:

> list="'a  a'   'b    c'"; echo "$(echo $list)"
'a a' 'b c'
> list="'a  a'   'b    c'"; echo "$(echo "$list")"
'a  a'   'b    c'

两者都没有预期的输出。只有在执行以下操作时才能实现此目的:

> list=('a  a'   'b    c'); echo "$(echo "${list[@]}")"
a  a b    c

Tadaa!谢谢大家:)

1 个答案:

答案 0 :(得分:0)

gniourf_gniourf所述,您可能只需要像... done <<< "$line_separated_input"那样双引号变量。用双引号括起来的参数将其自身表示为单个单词,即使它包含空格分隔符,因此它会阻止word splitting,这可能会导致意外后果。

为了更好地举例说明,请参阅以下示例:

var="/tmp/my directory"
mkdir -p "$var"

输出:创建目录/tmp/my directory

现在,没有双引号:

var="/tmp/my directory"
mkdir -p $var

输出:创建目录/tmp/my