2014-02-12 57 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