grep 使用双引号、单引号或不使用双引号之间的区别

grep 使用双引号、单引号或不使用双引号之间的区别

我想知道用 grep 命令查找带有双引号、单引号或无引号的字符有什么区别,例如

grep ^'\' foo

grep ^"\" foo

grep \ foo

答案1

实际上,您使用 产生了一个不好的例子,并将\其放在^引号之外。

引号的行为(或不存在)由您使用的 shell 决定(我假设是bash),而不是由grep.作为一般经验法则:

"  double quotes      Shell variables between the quotes are expanded
'  single quote       Shell variables do not get expanded
   no quotes          you can only use a single word, unless you escape the spaces.

因此,请记住 shell 首先进行一些解释,然后将参数传递给grep.

现在一些例子:

cat >afile <<EOF
a
aa
aaa
EOF
cat > abfile <<EOF
a
b
ab
aba
EOF
avar=a

我们创建两个文件afileabfile一个 shell 变量avar

grep 'a' afile会给:

a
aa
aaa

grep "a" afile会给:

a
aa
aaa

(相同)。grep "$avar" afile将变量扩展avara因此,结果是

a
aa
aaa

但是,grep '$avar' afile不会扩展变量avar,因此结果是:

(空的)

ab 文件是为示例创建的,不带引号。您现在应该明白为什么:

avar='a abfile'
grep $avar

给出:

a
ab
aba

当然,如果您想查找单引号,则应该查找单引号,grep "'"反之亦然。

答案2

任何由连接在一起的带引号的字符串组成的 shell“单词”仍然是单个参数。所以你可以用不同的规则来论证。

Paul--) Q='One Two'
Paul--) J=A'${Q}'B"${Q}"C
Paul--) echo ::"${J}"::
::A${Q}BOne TwoC::
Paul--) echo ::${J}{Foo,Bar}::
::A${Q}BOne TwoCFoo:: ::A${Q}BOne TwoCBar::
Paul--) echo ::"${J}{Foo,Bar}"::
::A${Q}BOne TwoC{Foo,Bar}::

相关内容