2014-02-12 81 views
1
WBINFO="/usr/bin/wbinfo -t" 
TMP="/tmp/winbind" 
RESTART="/sbin/service winbind restart" 
TXT="failed" 


$WBINFO > $TMP 
TARGET='cat $TMP |grep $TXT | wc -l' 

if [ "$TARGET" -eq "1" ]; 
then 
$RESTART 
else 
echo good 

fi 

「整數表達式預期」我得到這個錯誤:錯誤的腳本

line 10: [: cat $TMP |grep $TXT | wc -l: integer expression expected 

回答

3

單引號字符串不擴大$FOO到變量FOO的內容。使用雙引號(")。

此外,它看起來像你想要的內容TARGETcat命令的輸出。如果是這樣,你可能想:

TARGET=$(cat "$TMP" | grep "$TXT" | wc -l) 

即使再進一步,cat file | grep pattern是次優的 - grep知道如何把文件作爲參數來分析,而不是調用cat,這是一個整體的其他過程中產卵。你可能真的想:

if [[ $(grep -c "$TXT" "$TMP") -eq 1 ]]; then 
0

改變這一行

TARGET='cat $TMP |grep $TXT | wc -l' 

TARGET=$(cat $TMP |grep $TXT | wc -l) 

TARGET=`cat $TMP |grep $TXT | wc -l` 
3
TARGET='cat $TMP |grep $TXT | wc -l' 

這assig ns字符串'cat $TMP |grep $TXT | wc -l'到變量$TARGET

它看起來像你想要的是命令的輸出,這需要反引號:

TARGET=`cat $TMP |grep $TXT | wc -l` 

,或者,如果你有一個比較現代的外殼,$(...)語法:

TARGET=$(cat $TMP |grep $TXT | wc -l) 

而且,該命令可以大大簡化,從上面到這個:

TARGET=$(grep $TXT $TMP | wc -l) 

這樣:

if [ "$TARGET" -eq "1" ]; 

這樣::

TARGET=$(grep -c $TXT $TMP) 

最後,$TARGET變量可以完全如果您更改這個if聲明消除

if [ $(grep -c "$TXT" "$TMP") = 1 ]; 

或者你可以使用[[ ... ]]而不是[ ... ](它是bash的首選)。

或者,如果你只關心是否在所有發生的模式(而不是要求它恰好出現一次):

if grep -q "$TXT" "$TMP"; 

對於這個問題,可以消除$TMP文件爲好;我將把它作爲一個練習。 8)}

請查閱有關grep的文檔以瞭解選件的功能。 (-c選項告訴它打印匹配數,-q什麼都不打印,但仍然設置狀態以指示是否找到該模式)。

請注意,我還在變量引用周圍添加了引號,如果它們的值可能包含任何特殊字符,那麼這是很好的做法。

+1

好的答案,但我想指出(儘管在這種情況下不是明顯的效用),問題的腳本明確地測試了匹配的數量爲1,如果以某種方式不運行'$ RESTART'兩個或兩個以上的文件匹配(: – DopeGhoti

+0

@DopeGhoti:良好的捕獲,謝謝。我已經更新了我的答案。 –

+1

很好的答案,但我認爲你的意思是'-q' - 正如你在下面的文字中提到的 - 而不是在'''s'中,'''不應該在那裏。最後,還有一點值得一提的是,在bash中[[''優先於''' – mklement0