尝试在shell脚本中测试命令的零长度输出

时间:2014-04-23 00:26:55

标签: shell sh

在shell脚本方面,我是一个新手。我做错了什么?

我正在尝试grep正在运行的日志文件,并在grep返回数据时采取措施。

# grep for "success" in the log which will tell us if we were successful
tail -f file.log | grep success > named_pipe &

# send signal to my server to do something
/bin/kill -10 $PID

timeout=0;
while : ; do
    OUTPUT=$(cat < named_pipe)
    if test [-n] $OUTPUT
        then
            echo "output is '" $OUTPUT "'"
            echo_success
        break;
    else
        timeout=$((timeout+1))
        sleep 1 
        if [ $timeout -ge $SHUTDOWN_TIMEOUT ]; then
            echo_failure
            break
        fi
    fi
done

我发现即使日志中没有“成功”,test [-n] $ OUTPUT也会返回true。这是因为显然OUTPUT等于“”。为什么OUTPUT是单个空格而不是空?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是针对您的问题的较小测试用例:

output=""
if test [-n] $output
then
  echo "Why does this happen?"
fi

这是因为当$output为空或空格时,它会扩展为空,只需运行test [-n]

test foo非空时,

foo为真。你的foo是用方括号括起来的旗帜并不重要。

执行此操作的正确方法是不使用括号,并使用引号:

if test -n "$output"
then
  ...
fi

至于为什么$OUTPUT是单个空格,这很简单:事实并非如此。 echo只是写出以空格分隔的参数,并指定了多个参数。正确的代码是echo "output is '$OUTPUT'"