【问题标题】:Bash: Insert variable content into command substitution as arguments - how to quote correctly?Bash:将变量内容作为参数插入命令替换 - 如何正确引用?
【发布时间】:2017-05-13 03:20:50
【问题描述】:

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

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

多多!谢谢大家:)

【问题讨论】:

  • tr '\n' '-' &lt;&lt;&lt;"$line_separated_input" 适合你吗?
  • 只用引号!!! ... done &lt;&lt;&lt; "$line_separated_input" 带引号!!!

标签: bash command-substitution variable-substitution


【解决方案1】:

正如gniourf_gniourf 评论的那样,您可能只需要像... done &lt;&lt;&lt; "$line_separated_input" 这样的双引号即可。用双引号括起来的参数显示为单个单词,即使它包含空格分隔符,因此它会阻止 word splitting,这可能会导致意想不到的后果。

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

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

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

现在,不用双引号:

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

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

【讨论】:

  • 这不是完整的解决方案,请参阅我的编辑。不过谢谢! :-)
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2015-07-24
  • 2013-04-25
  • 2016-05-31
相关资源
最近更新 更多