引用包含单引号和双引号的bash命令参数的最简单方法是什么?没有变量插值?
在Ruby中,您可以使用%{},%[]等来引用字符串。在这种情况下,单引号和双引号将被视为字符。
我的问题并不完全,这里有进一步的解释:
我问的原因是因为我经常在命令行运行ruby和perl代码。由于这些语言使用了大量单引号和双引号以及全局变量(如$ 1 $ _等),因此与bash发生冲突。
示例:
ls -lat | ruby -p -e '$_ =~ /(\S+)\s+(\S+)\s+(\S+)/; $_ = "'\''" + ($3 || "") + "'\''" + "\n"'
我正在寻找类似于ruby中%引用的东西:
ls -lat | ruby -p -e %{$_ =~ /(\S+)\s+(\S+)\s+(\S+)/; $_ = "'" + ($3 || "") + "'" + "\n"}
答案 0 :(得分:5)
对于heredoc来说可能最容易:
read -r arg << \EOF
A string "with" 'quotes'
EOF
将$ arg设置为heredoc的未插入内容。这不允许将换行符嵌入变量中。如果你想要一个多行值:
unset var; while read -r v; do var="$var${var+
}$v; done << \EOF
A multi-line "" string
with different 'quotes'
EOF
不幸的是,Ormaaj使用IFS的评论无法捕捉新行。
答案 1 :(得分:1)
由于您不需要变量插值,您可以使用$'...'
引用(尽管您仍然需要转义单引号,因此这可能不符合您的要求):
x=$'String containing \' and "'