【问题标题】:In bash script, how to use function exit status in while loop condition在 bash 脚本中,如何在 while 循环条件中使用函数退出状态
【发布时间】:2025-11-28 22:15:01
【问题描述】:

下面是我的 shell 脚本。如何比较while循环条件块中函数的退出状态?无论我从 check1 函数返回什么,我的代码都会进入 while 循环

#!/bin/sh
    check1()
    {
            return 1
    }

    while [ check1 ]
    do
            echo $?
            check1
            if [ $? -eq 0 ]; then
                    echo "Called"
            else
                    echo "DD"
            fi
            sleep 5
    done

【问题讨论】:

  • 我不知道你为什么要调用 check1 两次?您应该能够假设每次通过该循环都被“调用”...

标签: linux bash shell sh


【解决方案1】:

删除test 命令 - 也称为[。所以:

while check1
do
    # Loop while check1 is successful (returns 0)

    if check1
    then
        echo 'check1 was successful'
    fi

done

从 Bourne 和 POSIX shell 派生的 shell 在条件语句之后执行 命令。一种看待它的方法是 whileif 测试成功或失败,而不是真假(尽管true 被认为是成功的)。

顺便说一句,如果您必须显式测试$?(这并不经常需要),那么(在 Bash 中)(( )) 构造通常更易于阅读,如下所示:

if (( $? == 0 ))
then
    echo 'worked'
fi

【讨论】:

    【解决方案2】:

    函数(或命令)执行返回的值存储在 $? 中,一种解决方案是:

    check1
    while [ $? -eq 1 ]
    do
        # ...
        check1
    done
    

    一个更好更简单的解决方案可能是:

    while ! check1
    do
        # ...
    done
    

    在这种形式中,零为真,非零为假,例如:

    # the command true always exits with value 0
    # the next loop is infinite
    while true
        do
        # ...
    

    您可以使用! 来否定该值:

    # the body of the next if is never executed
    if ! true
    then
        # ...
    

    【讨论】:

    • 你也可以考虑until而不是while !
    【解决方案3】:

    为了完整起见,另一种方法是使用 while 的内联函数退出代码

     while check1  ; [ $? -eq 0 ] ; do
    

    来自here

    如果将方法更改为“echo”style return value,也可以使用参数。

     while [ $(check1 my_param) < 33] ; do ...
    

    【讨论】: