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
答案 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`