今天在寫一個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。
grep使用簡明及正則表達式 http://www.linuxidc.com/Linux/2013-08/88534.htm
Linux下Shell編程——grep命令的基本運用 http://www.linuxidc.com/Linux/2013-06/85525.htm
grep 命令詳解及相關事例 http://www.linuxidc.com/Linux/2014-07/104041.htm
Linux基礎命令之grep詳解 http://www.linuxidc.com/Linux/2013-07/87919.htm
設置grep高亮顯示匹配項 http://www.linuxidc.com/Linux/2014-09/106871.htm
Linux grep命令學習與總結 http://www.linuxidc.com/Linux/2014-10/108112.htm