在 bash 中,我尝试在文件中查找以 \ 开头的行,并使用反引号返回结果。
例如:
echo \\Hello > myFile
out=`cat myFile | grep '^\\Hello'`
echo $out
即使没有返回任何内容
cat myFile | grep '^\\Hello'
返回,如预期。
\Hello
这看起来非常奇怪的 shell 行为。特别是,tcsh 中的类似命令序列执行了人们所期望的操作:
set out=`cat myFile | grep '^\\Hello'`; echo $out
回报
\Hello
有人可以解释一下发生了什么事吗?谢谢
答案1
读http://mywiki.wooledge.org/BashFAQ/082尤其是
反引号内的反斜杠以不明显的方式处理
:
`...`
是只有最古老的非 POSIX 兼容 bourne-shell 才需要的遗留语法。总是偏爱语法有几个原因$(...)
,所以:
echo \\Hello > myFile
而不是
out=$(cat myFile | grep '^\\Hello')
稍微简化一下:
out=$(grep '^\\Hello' myFile)
然后
echo $out
和“双引号”每个包含空格/元字符的文字和每一个扩展:“$var”、“$(命令“$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"