将变量传递给标准输入上的命令时可以保留单引号吗?

Can single quotes be preserved when passing a variable to a command on stdin?

示例:

 $ foo="text with 'single quotes'"
 $ echo $foo

给我

 text with 'single quotes'

这是我想要的输出,但我想在 stdin 上传递 $foo 并得到相同的结果。类似于以下内容之一:

 $ xargs echo <<< $foo

 $ echo $foo | xargs echo

这两个都给我

 text with single quotes

有没有办法在不控制 foo 内容的情况下保留单引号?

我正在寻找一个不管命令如何都能工作的解决方案,我选择了 xargs echo 因为我认为它简单地显示了行为。该解决方案可能不存在,但如果有人有任何提示,将不胜感激!

你在解析上加倍了,所以你需要在引用上加倍。

$: foo="text with \'single quotes\'"
$: xargs echo <<< "$foo"
text with 'single quotes'

所以同理,

$: foo="text with 'single quotes'"
$: xargs echo <<< \"$foo\"
text with 'single quotes'

不过,这取决于解析次数,这是您需要理解和适应的。对只有一层解析的命令应用two-layer的解决方案会产生相反的效果-

$: echo \"$foo\"
"text with 'single quotes'"

现在可以看到额外的引号了。

默认情况下 xargs 将解析引号和反斜杠。使用 -d 设置明确的项目分隔符并禁用此行为,这很少是可取的。

$ xargs -d '\n' 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'