使用空白/空grep的Do语句返回?

时间:2011-10-27 21:48:13

标签: bash shell while-loop if-statement

这是我的foobar.sh的代码:

!#/bin/bash
while [ 1 ]
do
    pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`
    echo $pid
    if [ "$pid"="" ]
    then
            echo "Process has ended lets get this show on the road..."
            exit
    else
            echo "Process has not ended yet"
    fi
    sleep 6
done

我基本上运行一个infinate循环,一旦受监视的进程结束就会执行命令X但是当我的脚本循环时我最终得到以下消息:

./foobar.sh: line 7: [: missing `]'
Process has not ended yet

有没有办法让脚本接受零反馈会触发我的'Then'语句并执行命令X,因为它不喜欢当前的方法。

4 个答案:

答案 0 :(得分:10)

而不是

if [ "$pid"="" ]

请尝试

if [ "$pid" = "" ]

空格大约=很重要。

您也可以尝试

if [ -z "$pid" ]

答案 1 :(得分:3)

我会做

while pgrep -fl "mylittleprogram"; do sleep 6; done
exit # process has ended

(pgrep在包psmisc IIRC中)

我刚试过它。如果您希望等待静音,可以将pgrep的输出重定向到/dev/null。添加更多香料,使事物不间断:

{
     trap "" INT
     while pgrep -fl "mylittleprogram" >/dev/null
     do 
         sleep 6
     done
     true
} && exit

答案 2 :(得分:1)

零测试是if [ -z "$pid" ]

答案 3 :(得分:0)

而不是由:

提供的模糊匹配
pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`

...和古老的反引号语法,请考虑这与进程基本名称完全匹配,并生成您选择的输出格式(此处为进程pid,如果存在):

pid=$(ps -C mylittleprogram -opid=)

然后,如上所述,只需测试一个空值:

[ -z "${pid" ] && echo "no process" || echo "I live as $pid"

输出元素名称后面的等号会抑制您通常会得到的标题。联机帮助页是你的朋友。