Leo*_*mon 2 shell grep bash quoting command-substitution
在 bash 中,我试图为以 \ 开头的行grep 文件,并使用反引号返回结果。
例如:
echo \\Hello > myFile
out=`cat myFile | grep '^\\Hello'`
echo $out
Run Code Online (Sandbox Code Playgroud)
什么都不返回,即使
cat myFile | grep '^\\Hello'
Run Code Online (Sandbox Code Playgroud)
返回,如预期的那样。
\Hello
Run Code Online (Sandbox Code Playgroud)
这看起来非常奇怪的外壳行为。特别是,tcsh 中的 anologous 命令序列做了人们所期望的:
set out=`cat myFile | grep '^\\Hello'`; echo $out
Run Code Online (Sandbox Code Playgroud)
返回
\Hello
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这是怎么回事吗?谢谢
阅读http://mywiki.wooledge.org/BashFAQ/082,尤其是
反引号内的反斜杠以不明显的方式处理
:
`...`
Run Code Online (Sandbox Code Playgroud)
是最古老的非 POSIX 兼容的 bourne-shell 所需的遗留语法。总是喜欢这种$(...)
语法有几个原因,所以:
echo \\Hello > myFile
Run Code Online (Sandbox Code Playgroud)
而不是
out=$(cat myFile | grep '^\\Hello')
Run Code Online (Sandbox Code Playgroud)
稍微简化一下:
out=$(grep '^\\Hello' myFile)
Run Code Online (Sandbox Code Playgroud)
然后
echo $out
Run Code Online (Sandbox Code Playgroud)
和“双引号”每个包含空格/元字符和每个扩展的文字:“$var”、“$(command“$var”)”、“${array[@]}”、“a & b”。对代码或文字 $ 使用“单引号”:“成本 5 美元”,ssh 主机“echo "$HOSTNAME"”。请参阅http://mywiki.wooledge.org/Quotes、http://mywiki.wooledge.org/Arguments和http://wiki.bash-hackers.org/syntax/words。
所以最后:
echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"
Run Code Online (Sandbox Code Playgroud)