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

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)

有人可以解释一下这是怎么回事吗?谢谢

Gil*_*not 7

阅读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/Quoteshttp://mywiki.wooledge.org/Argumentshttp://wiki.bash-hackers.org/syntax/words

所以最后:

echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"
Run Code Online (Sandbox Code Playgroud)