在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是单个空格而不是空?
我该如何解决这个问题?
答案 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'"