我想在 grep 找到或找不到我可以写的东西时循环:
while grep 'matches' inLogFile.txt
do
echo good.
sleep 10
done
Run Code Online (Sandbox Code Playgroud)
或者
while grep -v 'notHereYet' inLogFile.txt
do
sleep 2
done
echo -e '\a'Yo! It is here now.
Run Code Online (Sandbox Code Playgroud)
我在交互式 shell 提示符下输入这些。
所以我想反复检查df卷实际安装的时间,有点像:
while df | grep -v '/toBeMounted'
do
sleep 2
done
echo -e '\a'Hey, I think you wanted to know that /toBeMounted is available finally.
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何将管道分组到条件中。
我知道我可以这样做:
while [ -z "$(df|grep '/toBeMounted')" ]
do
sleep 2
done
echo -e '\a'Okay that is finally present now.
Run Code Online (Sandbox Code Playgroud)
但是我觉得应该有一种方法可以使用退出值而不是字符串比较来做到这一点。
Joh*_*024 10
为了使逻辑正确,只需要进行微小的更改。用:
while ! df | grep '/toBeMounted'
do
sleep 2
done
echo -e '\a'Hey, I think you wanted to know that /toBeMounted is available finally.
Run Code Online (Sandbox Code Playgroud)
问题中相应的代码是:
while df | grep -v '/toBeMounted'
Run Code Online (Sandbox Code Playgroud)
管道的退出代码是管道中最后一个命令的退出代码。 grep -v '/toBeMounted'如果至少一行输入不匹配,将返回 true (code=0) /toBeMounted。因此,这将测试除了/toBeMounted.之外是否还安装了其他东西。 这根本不是你要找的。
要使用df和grep测试是否/toBeMounted已挂载,我们需要
df | grep '/toBeMounted'
Run Code Online (Sandbox Code Playgroud)
如果/toBeMounted已安装,则返回 true 。你真正需要的是否定这个:如果/toBeMounted没有安装,你需要一个为真的条件 。为此,我们只需要使用否定,表示为!:
! df | grep '/toBeMounted'
Run Code Online (Sandbox Code Playgroud)
而且,这就是我们在上面的代码中使用的。
从Bash 手册:
管道的返回状态是最后一个命令的退出状态,除非启用了 pipefail 选项。如果启用了 pipefail,管道的返回状态是最后一个(最右边)命令的值,以非零状态退出,如果所有命令都成功退出,则为零。如果保留字
!位于管道之前,则该管道的退出状态是上述退出状态的逻辑否定。shell 在返回值之前等待管道中的所有命令终止。