Bash: 将变量内容作为参数插入到命令替换中 - 如何正确引用?
Bash: Insert variable content into command substitution as arguments - how to quote correctly?
我真的找不到解决这个问题的方法:
假设我有一个有多行的变量,每一行最后应该是一个参数。
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
太棒了!谢谢大家:)
正如 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
被创建
我真的找不到解决这个问题的方法: 假设我有一个有多行的变量,每一行最后应该是一个参数。
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
太棒了!谢谢大家:)
正如 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
被创建