Shell脚本中使用wc -l和if语句无法正常工作

13

问题出在这段代码:

    words=`wc -l /home/tmp/logged.log | awk '{print $1}'`;
    if [ $words == 26 ]
    then
    echo $words
    echo Good
    else
    echo Not so good
    fi

它总是返回 else 语句。即使结果是 26。

我也尝试过

     words=`wc -l < /home/jonathan/tmp/logged.log`;

我猜 $words 末尾有一个换行符 "26\n" - Dan D.
为了防止 wc 打印文件名,使它从 stdin 读取:words=$(wc -l < /home/tmp/logged.log) - glenn jackman
3个回答

7

尝试使用 [ $words -eq 26 ] 代替 [ $words == 26 ]

或者 [ 26 == 26 ] 检查语句是否正常工作。


感谢您的帮助,我在尝试了26 == 26后自己找到了问题所在。 问题出在这个命令:lastlog | grep Never | wc -l > /tmp/logged.log。 日志文件中包含了1行值为26的内容。 - user1204032
太好了!然而,您可以使用类C运算符来在Bash中执行操作,例如使用expr [[ 26 == 26 ]] - triclosan

3

因为==是无效的。请使用=

if [ $words = 26 ]

顺便提一下,你可以使用cut代替awk

wc -l /home/tmp/logged.log  | cut -f1 -d" "

他的第二个例子,wc -l < file,是正确的方式。 - jordanm
感谢您的帮助,我在尝试了26 == 26后自己找到了问题所在。问题出在这个命令:lastlog | grep Never | wc -l > /tmp/logged.log。 日志文件中只有一行,值为26。 - user1204032

1

试试这个:

words=`wc -l /home/tmp/logged.log | awk '{print $1}'`;
if test $words -eq 26; then
    echo $words
    echo Good
else
    echo Not so good
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接