shell指令碼中grep時關於變數帶雙引號的小問題

來源:互聯網
上載者:User

標籤: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時關於變數帶雙引號的小問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.