我想 grep 查找具有 string 的变量test
,但我也想确保它只会找到它test
是否是一行中唯一的单词。
所以,我尝试了这个:
string=test
echo "test" | grep "$string$"
我想知道是否grep
知道第一部分$string
(在 grep " $string $" 中)要求查找字符串test
,而最后一部分$
(在 grep "$string $ " 中要求查找test
,但是行中不应该有任何内容test
。grep
能够区$string
分为变量,并且只能$
作为行尾的正则表达式,还是我必须使用某种方式来区分它们?
Grep 一无所知。如果 grep 看到
$string$
,它将尝试匹配$string{end-of-line}
。发生的情况是外壳在启动$string
之前扩展了变量grep
,因此grep
接收test$
为正则表达式。但是,给定这个词
$string$
,为什么最后一个$
不扩展而$string
is 呢?因为$
不是有效的变量名。这在POSIX 规范中非常清楚:和XBD 名称状态
并且还有一些特殊的参数,比如
$$
,$@
,$#
等。如果您不想记住所有这些,只需按照Gordon Davisson 的建议 ,避开所有
$
不应该引入变量的内容,以确保将其保留。还要记住变量用双引号而不是单引号展开。
为此,您需要正则表达式
^test$
(将字符串锚定到行首和行尾)或-x
使用grep
. 您的原始尝试将匹配Atest
,因为正则表达式test$
未锚定到行首。