表达式返回0时如何退出循环?

时间:2016-08-31 09:36:02

标签: bash

我有这个:

while [ "ps aux | grep '[0]:00 Xvfb :99 -screen 0 1024x768x16'" ]
do 
    echo "sleep"
    ps aux | grep "[0]:00 Xvfb :99 -screen 0 1024x768x16"
    sleep 1
done

这给了我:

sleep
sleep
sleep
sleep
sleep
sleep
root         7  0.5  1.5 207336 31620 ?        Sl   09:31   0:00 Xvfb :99 -screen 0 1024x768x16
sleep
root         7  0.4  1.5 207336 31620 ?        Sl   09:31   0:00 Xvfb :99 -screen 0 1024x768x16
sleep
root         7  0.3  1.5 207336 31620 ?        Sl   09:31   0:00 Xvfb :99 -screen 0 1024x768x16
...
...
...

如果ps aux | grep返回0(意味着Xvfb进程正在运行),如何更改我的oneliner以便退出循环?

1 个答案:

答案 0 :(得分:7)

目前,您正在评估字符串是否为空(在bash中,[ "string" ]等同于[ -n "string" ])。

如果要在模式匹配时退出,请使用:

while ! ps aux | grep -q '[0]:00 Xvfb :99 -screen 0 1024x768x16'; do 
    echo "sleep"
    sleep 1
done

grep的-q选项启用“安静模式”,因此输出被抑制。

请注意,您可以(应该?)使用pgrep代替您的管道:

while ! pgrep '0:00 Xvfb :99 -screen 0 1024x768x16'; do
# ...