将变量传递给标准输入上的命令时可以保留单引号吗?
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'
示例:
$ 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'