bash:将可变内容插入命令替换为参数 - 如何正确引用



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

line   1
line two
...

我只在运行时获取此数据,但是应该像这样构建这样的命令:

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

(数据必须由AN分开 - 但这不是问题。)

我认为我确实尝试了所有可能的组合,但它无法解决。我已经检查了这个网站,但是我> think<它没有为我的问题提供解决方案: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):(如何在引用的东西中停止在引用的东西中停止单词splitting因变量替换而插入吗?

编辑:谢谢大家,引用$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!谢谢大家:)

正如 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

相关内容

  • 没有找到相关文章

最新更新