在bash while循环中复合条件

时间:2016-03-20 23:09:59

标签: bash

我正在修改现有的bash脚本,并且在使while循环正常运行时遇到一些麻烦。这是原始代码

while ! /usr/bin/executable1
do
    # executable1 returned an error. So sleep for some time try again
    sleep 2
done

我想将此更改为以下

while ! /usr/bin/executable1 && ! $(myfunc)
do
    # executable1 and myfunc both were unsuccessful. So sleep for some time
    sleep 2
done

executable1在成功时返回0,在失败时返回1。我理解bash中的“true”计算结果为0,这就是为什么原始脚本会一直循环直到可执行文件返回成功为止

因此myfunc编码如下

myfunc ()
{
    # Check if file exists. If exits, return 0, If not, return 1
    if [ -e someFile ]; then
        return 0
    fi

    return 1 
 }

我注意到我的新while循环似乎没有调用executable1。它总是调用myfunc()然后立即退出循环。我做错了什么?

我尝试了各种编码while循环的方法(使用(()),[],[[]]等),但似乎没有什么能解决它

1 个答案:

答案 0 :(得分:1)

您不需要$(...)来调用函数,只是为了捕获其标准输出。你只想要

while ! /usr/bin/executable1 && ! myfunc
do
    sleep 2
done

请注意,myfunc也可以更简单地编写

myfunc () {
    [ -e someFile ]
}

或甚至(在bash中)

myfunc () [[ -e someFile ]]

无论哪种方式,几乎不值得单独定义myfunc;只需使用

while ! /usr/bin/executable1 && ! [[ -e someFile ]]
do
    sleep 2
done

使用until循环也可能更简单:

until /usr/bin/executable1 || [[ -e someFile ]]; do
    sleep 2
done