"$a$"
字符串"$a$" 扩展为$a shell 变量的值,后跟文字$(为什么?见下文)。如果$a变量未设置,则其值被解释为空字符串,扩展结果为"$"(只有美元符号)。
为什么最后一个美元符号没有展开?**
parameter expansion 的基本形式是"${PARAMETER}"。如果PARAMETER 不是一个多于一位的位置参数(10、11 等),并且如果PARAMETER 后面没有跟不被解释的字符,则不需要大括号作为其名称的一部分。由于$ 开始下一个参数扩展、命令替换或算术扩展,因此在我们的例子中它不会被解释为a 参数名称的一部分。
由于最后一个$ 后面没有任何内容,因此它不符合任何类型的扩展,因此保持原样。
Grep 如何解释模式
由于match-end-of-line operator ($) 匹配字符串末尾或字符串中换行符之前的空字符串,因此模式$ 匹配任何行。
因此,如果$a 为空,grep "$a$" file 将匹配并打印file 中的所有行。
'$a$'
单引号保护字符串免受任何扩展(特殊字符的解释)。也就是说,字符串按原样传递给命令。
在grep '$a$' file 调用的情况下,模式匹配"$a" 字符串在行尾。下面说明原因。
正如我们所知,最后一个$ 表示行尾。其余的美元符号根据模式进行解释。它可以解释为文字美元符号,也可以解释为行尾。
在以下情况下,$ 表示行尾运算符。否则,$ 是普通的。
- 如果
$ 是模式中的最后一个,如foo$。
-
syntax 位
RE_CONTEXT_INDEP_ANCHORS 已设置,位于括号表达式之外。
- 结束一个开组或交替运算符表达式,例如
'\(b$\)',或'\(b$\)\|a'。
自从
- 我们模式中的第一个
$ 显然不是最后一个,
- 您使用的是基本的
RE_SYNTAX_GREPsyntax,即BRE,
- 并且不使用开放组/交替,
$a$ 中的第一个美元符号是普通。
当第一个$不是普通?
这不是普通的,例如在扩展正则表达式的情况下。也就是说,使用-E 或-P 选项,或者使用egrep 或pgrep 命令,例如(设置了RE_CONTEXT_INDEP_ANCHORS 语法位)。
转义美元符号
考虑转义美元符号,即使它在基本正则表达式中被解释为文字 $。它会养成一个好习惯。
要在单引号中转义美元符号,请使用反斜杠:'\$a$'。
双引号内的反斜杠具有特殊含义,因此您需要对反斜杠本身进行转义:"\\\$a\$"。