2011-07-05 79 views
2

shell腳本片段:錯誤使用[[]]和當量

tagSearch= $(grep '^\#ctags$' ./"$1" | wc -l) 
if [[ $tagSearch -ne "0" ]] 
then 
    ... 
fi 

結果:

line 2: /bb/bin/1: Permission denied

語境:

我想檢測是否特定模式存在於一個文件中,所以我可以採取特定的行動。

我明白我得到的錯誤,檢測正在工作,但腳本正在嘗試評估結果'1'並在我的路徑中運行程序'1'。這不是我想要的。我如何獲得我正在尋找的行爲?

+0

這是原因之一要時常引號('「')的表達式變量 – bitmask

回答

6

bash shell中的變量賦值在等號後面不應有空格。其實它永遠不應該有空白。見下文。

tagSearch=$(grep '^\#ctags$' "./$1" | wc -l) 
if [[ $tagSearch -ne 0 ]] 
then 
    ... 
fi 

不是你的錯誤很重要,但也注意到,使用double bracket syntax時,你不需要引述零比你與它比較的變量了。

其實你的整個代碼可以使用grep的靜音模式和評價返回代碼,看看是否有任何比賽重新分解:

if grep '^\#ctags$' "./$1" 
then 
    ... 
fi 
7

問題是

tagSearch= $(grep '^\#ctags$' ./"$1" | wc -l) 
----------^ 

你不能在等號周圍使用空格;你實際上在這裏做的是暫時將tagSearch設置爲環境中的空字符串,然後調用grep '^\#ctags$' ./"$1" | wc -l,然後嘗試將其作爲命令運行,因爲$()已將結果插入到命令行中。

tagSearch=$(grep '^\#ctags$' ./"$1" | wc -l) 
+1

+1解釋得到了執行什麼導致該錯誤的 – Caleb

5

其實你可以有一個簡單,因爲grep的返回碼爲0,如果事情被發現(否則爲1),所以你不需要廁所-l。你也可以這樣寫:

if `grep -q pattern file`; then echo "yes"; else echo "no"; fi; 
+0

我不能起來。或接受這個,因爲它沒有真正回答這個問題,但我最終採取了你的建議,並刪除了wc -l並測試了返回代碼,謝謝! –

+0

@Greg:你問:「我如何獲得行爲I我在尋找什麼?「和我發佈的if-construction有你正在尋找的行爲...... – yankee

+0

夠公平的,我應該閱讀我自己的字面措辭。 –