標籤:shell grep 雙引號
今天在寫一個shell指令碼的時候,有一個操作是使用grep命令在一個檔案中搜尋指定內容。指定內容存放在檔案中,使用一個變數去擷取檔案中內容,再傳到grep命令中去。
這段代碼如下:
for target in `cat content.txt`
do
grep $target test.txt >>result.txt
done
content.txt文本中的內容為:
"域\[2\]"
"域\[3\]"
"域\[4\]"
因為使用grep時,最後要執行的命令是(grep "域\[2\]" test.txt),所以直接把雙引號寫在content.txt的文本中了。然後執行指令碼,執行指令碼的時候開始不對勁了,直接執行(grep "域\[2\]" test.txt)是能夠搜尋到內容的。但是在指令碼中就是搜尋不到內容了,於是添加了“set -x”來查看執行的命令,顯示執行的命令就是(grep "域\[2\]" test.txt)。最後折磨了半天,發現原來是content.txt文本中的雙引號的問題。改成如下後就執行成功,通過搜尋到內容了。
content.txt文本中的內容為:
域\[2\]
域\[3\]
域\[4\]
指令碼:
for target in `cat content.txt`
do
grep "$target" test.txt >>result.txt
done
於是想了想,又另外寫了個指令碼測試:
#!/bin/ksh
set -x
grep "\"hello\"" test.c
這個指令碼實際類比的就是上面把雙引號當作變數的一部分。
執行結果顯示執行的命令是:
+ grep "hello" test.c
和上面那例看到的是一樣,表面上看起來是在test.c中搜尋hello,但實際上搜尋的是("hello"),所以搜尋不到。同樣,對於之前的例子,我以為搜尋的是(域\[2\]),其實搜尋的是("域\[2\]"),但是("域\[2\]")這個確實是沒有的,所以搜尋不到。
也就是如果把雙引號放在content.txt傳給變數 ,導致雙引號作用不再是把要查詢的內容引起來,而是雙引號是變數的一部分了。最後雖然兩個看到的外觀一模一樣,但是意義卻不一樣了。哎,shell好神奇啊,不要相信你看到的,哈哈。
說明:使用的shell是ksh。
shell指令碼中grep時關於變數帶雙引號的小問題