[英]Special meaning of “$a$” in grep command
我正在嘗試學習Shell腳本,並且正在嘗試不同的方法。 在練習時,我遇到了grep "$a$" file1
並且無法理解輸出。
我知道單引號采用字面意思的區別,而雙引號則試圖找到特殊含義,例如$a
應該是變量$
。
我有內容file1
#!/bin/sh
a=1
b=1
echo $a
echo $b
for I in 1 2 3 4 5 6 7 8
do
c=a
b=$a
b=$(($a+$c))
echo $b
done
grep "$a$" file1
給了我整個file1
作為輸出,而grep '$a$' file1
給了我應有的輸出,就像以$a
結尾的行一樣。
請解釋為什么使用grep "$a$"
時,它將整個文件內容作為輸出輸出。
沒有特別的意義。
我在您的代碼中看不到任何grep
。 我假設您是從命令行grepping的,並且變量a
是未定義的。 因此, grep "$a$"
擴展為grep "$"
( $a
擴展為空),並且grep $
匹配每行,因為$
匹配行尾。
[更新]“擴展”是指shell變量擴展。 由於$a
在雙引號之間,因此外殼程序將$a
替換$a
變量a
(未定義)的值。 您的grep '$a$'
產生預期的結果,因為單引號之間的任何字符串始終不會被外殼覆蓋。 試試echo "$a$"
和echo '$a$'
。
以grep模式中的^
和$
開頭分別表示開始和結束。
在
grep "$a$" file1
$a
進行擴展,因為它在雙引號內。 在您的情況下, $a
應該是未定義的。 因此, "$a$"
的結果是$
,它與每一行的末尾匹配,因此您將獲得整個文件作為輸出。 要驗證這一點,請為a
分配一些測試值,然后運行grep。
a="TestValue" # Before running grep
grep "$a$" file1
我敢打賭,您將一無所獲。
現在,如果您想在雙引號中包含一個文字“ $”。 那你需要做
grep "\$a$" file1 # See the first $ is escaped
上面的命令將為您提供所有以$a
結尾的行
echo $a
b=$a
現在,如果您厭倦了轉義,可以使用如下單引號
grep '$a$' file1
# The first $ is literal $, and the last one symbolizes end of file.
# More over variable-expansion doesn't take place inside single quotes.
注意: file1
內的a=1
對grep結果沒有影響,因為file1
只是grep
的輸入。
"$a$"
字符串"$a$"
被擴展為$a
shell變量的值,后跟文字$
(為什么?請參見下文)。 如果未設置$a
變量,則其值將解釋為空字符串,並且擴展結果為"$"
(僅美元符號)。
參數擴展的基本形式是"${PARAMETER}"
。 括號不是必需的,如果PARAMETER
是不與多於一個的位(位置參數10
, 11
等),並且如果PARAMETER
不跟一個字符不被解釋為它的名稱的一部分。 由於$
開始下一個參數擴展,命令替換,算術擴展,它不被解釋為一個部分a
參數的名字在我們的案例。
由於最后一個$
后面沒有任何內容,因此它不符合任何擴展形式,並且保持不變。
由於匹配行結束符 ( $
)在字符串末尾或換行符之前匹配空字符串,因此模式$
匹配任何line 。
因此,如果$a
為空,則grep "$a$" file
將匹配並打印file
所有行。
'$a$'
單引號可以防止字符串擴展(特殊字符的解釋)。 即,字符串按原樣傳遞給命令。
對於grep '$a$' file
調用,該模式與該行末尾的 "$a"
字符串匹配。 下面說明原因。
我們知道,最后的$
表示行的結尾。 其余美元符號將根據模式進行解釋。 可以將其解釋為原義的美元符號或行尾。
在以下情況下, $
表示行尾運算符。 否則, $
是普通的。
$
在模式中位於最后,如foo$
。 RE_CONTEXT_INDEP_ANCHORS
被置位,並且在方括號表達式之外。 '\\(b$\\)'
或'\\(b$\\)\\|a'
。 以來
$
顯然不是最后一個, RE_SYNTAX_GREP
語法 ,即BRE, 第一個美元符號在$a$
是普通 $a$
。
$
不普通 ? 例如,在擴展正則表達式的情況下,這是不尋常的。 也就是說,例如,使用-E
或-P
選項,或者使用egrep
或pgrep
命令(其中RE_CONTEXT_INDEP_ANCHORS
語法位置1)。
即使在基本正則表達式中將美元符號解釋為文字$
,也應考慮轉義美元符號。 這會養成一個好習慣。
要在單引號內轉義美元符號,請使用反斜杠: '\\$a$'
。
在雙引號中,反斜杠具有特殊含義,因此您需要轉義反斜杠本身: "\\\\\\$a\\$"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.