How to get the exit status a loop in bash

后端 未结 8 692
醉梦人生
醉梦人生 2020-12-16 15:38

I know how to check the status of the previously executed command using $?, and we can make that status using exit command. But for the loops in bash are always returning a

相关标签:
8条回答
  • 2020-12-16 16:14

    The break builtin for bash does allow you to accomplish what you are doing, just break with a negative value and the status returned by $? will be 1:

    while true
    do
        if [ -f "./test" ] ; then
                break -1
        fi
    done
    echo $?  ## You'll get 1 here..
    

    Note, this is documented in the help for the break builtin:

    help break
    

    break: break [n] Exit for, while, or until loops.

    Exit a FOR, WHILE or UNTIL loop. If N is specified, break N enclosing loops.

    Exit Status: The exit status is 0 unless N is not greater than or equal to 1.

    You can break out of n number of loops or send a negative value for breaking with a non zero return, ie, 1

    I agree with @hagello as one option doing a sleep and changing the loop:

    #!/bin/bash
    timeout=120
    waittime=0
    sleepinterval=3
    until [[ -f "./test" || ($waittime -eq $timeout) ]]
    do
       $(sleep $sleepinterval)
       waittime=$((waittime + sleepinterval))
       echo "waittime is $waittime"
    done
    
    if [ $waittime -lt $sleepinterval ]; then
        echo "file already exists"
    elif [ $waittime -lt $timeout ]; then
        echo "waited between $((waittime-3)) and $waittime seconds for this to finish..."
    else
        echo "operation timed out..."
    fi
    
    0 讨论(0)
  • 2020-12-16 16:21

    The bash manual says:

    while list-1; do list-2; done
    until list-1; do list-2; done
      [..]The exit status of the while and until commands is the exit status
      of the last command executed in list-2, or zero if none was executed.[..]
    

    The last command that is executed inside the loop is break. And the exit value of break is 0 (see: help break).

    This is why your program keeps exiting with 0.

    0 讨论(0)
提交回复
热议问题