首页 > 解决方案 > 使用带引号的字符串的 bash set 命令

问题描述

我正在尝试解析一系列包含混合值和字符串的输出行。我认为该set命令将是一种直接的方法。

初步测试似乎很有希望。这是一个示例命令行及其输出:

$ (set "one two" three; echo $1; echo $2; echo $3)
one two
three

显然,我得到了两个变量的回显,而第三个变量则没有。

然而,当我把它放在我read用来捕获输出行的脚本中时,我得到了一种不同的解析:

echo \"one two\" three |
while read Line
do
    echo $Line
    set $Line
    echo $1
    echo $2
    echo $3
done

这是输出:

"one two" three
"one
two"
three

echo $Line命令显示引号存在,但该set命令不使用它们来分隔参数。为什么不?

在研究 and 的用法时readwhile read我遇到了这个while IFS= read成语,所以我尝试了一下,但它根本没有任何区别。

我已经阅读了几十个关于引用的问题,但没有找到任何可以为我澄清这一点的东西。显然我的引用水平很混乱,但是在哪里呢?我可以做些什么来获得我想要的东西,即在我的脚本中获得与从命令行获得的相同类型的解析?

谢谢。

标签: bashdouble-quotesquoting

解决方案


read不解释引号,它只是"one作为一个标记读取,two"作为另一个标记。(想想如果 shell 会评估来自随机位置的输入,事情可能会出错的所有方式。Python 2 的教训及其缺陷input()也是一个很好的例子。)

如果您真的想评估事物,eval那就去做吧;但它伴随着一大堆警告,如果不小心,往往会导致安全问题。

根据您想要完成的任务,也许可以在单独的行上提供输入?或者,如果这些是用户提供的参数,只需将它们保存在"$@". 还要注意如何将它们的一个子集传递给一个函数,"$@"如果你想弄乱它,它会获得自己的本地。

(切线地,您不将参数引用到echo. 请参阅何时在 shell 变量周围加上引号。)


推荐阅读