歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell腳本中grep時關於變量帶雙引號的小問題

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

日期:2017/3/1 9:33:10   编辑:SHELL編程

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

Copyright © Linux教程網 All Rights Reserved