在 bash 中,grep 查找以 \ 开头的行,并使用反引号分配结果

在 bash 中,grep 查找以 \ 开头的行,并使用反引号分配结果

在 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/Argumentshttp://wiki.bash-hackers.org/syntax/words

所以最后:

echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"

相关内容