今天在寫一個shell腳本的時候,有一個操做是使用grep命令在一個文件中搜索指定內容。指定內容存放在文件中,使用一個變量去獲取文件中內容,再傳到grep命令中去。shell
這段代碼以下:ide
for target in `cat content.txt`
do
grep $target test.txt >>result.txt
done測試
content.txt文本中的內容爲:get
"域\[2\]"it
"域\[3\]"class
"域\[4\]"test
由於使用grep時,最後要執行的命令是(grep "域\[2\]" test.txt),因此直接把雙引號寫在content.txt的文本中了。而後執行腳本,執行腳本的時候開始不對勁了,直接執行(grep "域\[2\]" test.txt)是可以搜索到內容的。可是在腳本中就是搜索不到內容了,因而添加了「set -x」來查看執行的命令,顯示執行的命令就是(grep "域\[2\]" test.txt)。最後折磨了半天,發現原來是content.txt文本中的雙引號的問題。改爲以下後就執行成功,可以搜索到內容了。變量
content.txt文本中的內容爲:搜索
域\[2\]grep
域\[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。