脚本中出现“预期的整数表达式”错误

时间:2014-02-12 00:45:36

标签: bash

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 个答案:

答案 0 :(得分:3)

单引号字符串不会将$FOO扩展为变量FOO的内容。使用双引号(")。

此外,您似乎希望TARGET的内容成为cat命令的输出。如果是这样,你可能想要:

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

更进一步,cat file | grep pattern不是最理想的 - grep知道如何将文件作为参数进行解析而不是调用cat,这是一个完整的其他生成过程。你可能真的想要:

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

答案 1 :(得分:3)

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

这会将文字字符串'cat $TMP |grep $TXT | wc -l'分配给变量$TARGET

看起来你想要的是命令的输出,这需要反引号:

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

或者,如果你有一个相当现代的shell,$(...)语法:

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

此外,从上面到此,该命令可以大大简化:

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

到此:

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

最后,如果您更改$TARGET语句,则可以完全取消if变量:

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

到此:

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

或者可以使用[[ ... ]],而不是[ ... ](它优选用于bash)的

或者,如果你只关心模式是否发生(而不是要求它只出现一次):

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

就此而言,您也可以删除$TMP文件;我会把它留作练习。 8 - )}

查阅grep的文档,了解选项的作用。 (该-c选项告诉它打印匹配的数量,-q打印什么,但仍然将状态设置为指示所述模式是否被找到)。

请注意,我还在变量引用周围添加了引号,如果它们的值可能包含任何特殊字符,这是很好的做法。

答案 2 :(得分:0)

更改此行

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

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

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