Shell虽然循环没有停止

Rgo*_*ike 0 bash shell while-loop

我正在编写一个例程来识别进程是否停止运行,并且一旦目标进程消失就会执行某些操作.

我想出了这段代码(作为我未来代码的测试):

#!/bin/bash
value="aaa"
ls | grep $value
while [ $? = 0 ]; 
    do
    sleep 5
    ls | grep $value
    echo $?
done;
echo DONE
Run Code Online (Sandbox Code Playgroud)

我的问题是,由于某种原因,循环永远不会停止,并在删除文件"aaa"后回显1.

0
0    >>> I delete the file at that point (in another terminal)
1
1
1
1
.
.
    .
Run Code Online (Sandbox Code Playgroud)

我删除文件后,我希望输出为"DONE"...

有什么问题?

解:

#!/bin/bash
value="aaa"
ls | grep $value
while [ $? = 0 ];
    do
    sleep 5
    ls | grep $value
done;
echo DONE
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 6

$?变化的价值非常容易.在当前版本的代码中,此行:

echo $?
Run Code Online (Sandbox Code Playgroud)

打印上一个命令的状态(grep) - 但它设置$?为0,即echo命令的状态.

将值保存$?在另一个变量中,该变量在下次执行命令时不会被破坏:

#!/bin/bash
value="aaa"
ls | grep $value
status=$?
while [ $status = 0 ]; 
    do
    sleep 5
    ls | grep $value
    status=$?
    echo $status
done;
echo DONE
Run Code Online (Sandbox Code Playgroud)

如果ls | grep aaa要检查名为的文件是否aaa存在,则:

while [ ! -f aaa ] ; ...
Run Code Online (Sandbox Code Playgroud)

这是一种更清洁的方式.

  • @Rgonomike:你可以写:"而ps -ef | ... | grep mysqldump;做睡眠1200;完成".这将简化代码.(虽然解析ps是错误的做法.你真正想要的是让mysqldump的父进行跟随处理,因为当mysqldump退出时它会被警告.) (2认同)