如何解决在stdin上将变量传递给命令时,能否保留单引号?
示例:
$ 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'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。