问题描述
示例:
$ foo="text with 'single quotes'"
$ echo $foo
给我
text with 'single quotes'
这是我需要的输出,但是我想在标准输入上传递$foo
并得到相同的结果。类似于以下之一:
$ xargs echo <<< $foo
$ echo $foo | xargs echo
这两个都给我
text with single quotes
是否可以在不控制foo内容的情况下保留单引号?
我正在寻找一个不受命令影响的解决方案,我选择了xargs echo
,因为我认为它可以简单地显示行为。该解决方案可能不存在,但是如果有人有任何建议将不胜感激!
解决方法
默认情况下,xargs将解析引号和反斜杠。使用-d
设置一个显式的项目定界符并禁用此行为,这种情况很少有。
$ xargs -d '\n' echo <<< "$foo"
text with 'single quotes'
,
您正在加倍解析,因此您需要加倍引用。
$: foo="text with \'single quotes\'"
$: xargs echo <<< "$foo"
text with 'single quotes'
以同样的理由,
$: foo="text with 'single quotes'"
$: xargs echo <<< \"$foo\"
text with 'single quotes'
这取决于解析的次数,这是您需要理解和适应的。将两层解决方案应用于仅具有一层解析的命令会产生相反的效果-
$: echo \"$foo\"
"text with 'single quotes'"
现在多余的引号变得可见了。
,如果您希望xargs忽略引号,请尝试使用xargs标志xargs -0,如下所示:
foo="text with 'single quotes'"
echo $foo | xargs -0 echo
text with 'single quotes'
xargs -0 echo <<< $foo
text with 'single quotes'