shell腳本中grep時關於變量帶雙引號的小問題

    今天在寫一個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。

相關文章
相關標籤/搜索