Add (collect) exit codes in bash

前端 未结 7 924
执念已碎
执念已碎 2021-02-08 02:28

I need to depend on few separate executions in a script and don\'t want to bundle them all in an ugly \'if\' statement. I would like to take the exit code \'$?\' of each executi

相关标签:
7条回答
  • 2021-02-08 02:47

    As mouviciel mentioned collecting sum of return codes looks rather senseless. Probably, you can use array for accumulating non-zero result codes and check against its length. Example of this approach is below:

    #!/bin/sh
    
    declare RESULT
    declare index=0
    declare ALLOWED_ERROR=1
    
    function write_result {
        if [ $1 -gt 0 ]; then
            RESULT[index++]=$1
        fi
    }
    
    true
    write_result $?
    
    false
    write_result $?
    
    false
    write_result $?
    
    echo ${#RESULT[*]}
    if [ ${#RESULT[*]} -gt $ALLOWEDERROR ] 
       then echo "Too many errors"
    fi
    
    0 讨论(0)
  • 2021-02-08 02:50

    If you want to use ALLOWEDERROR in your script, preface it with a $, e.g $ALLOWEDERROR.

    0 讨论(0)
  • 2021-02-08 02:57

    Here are some ways to perform an addition in bash or sh:

    RESULT=`expr $RESULT + $?`
    RESULT=`dc -e "$RESULT $? + pq"`
    

    And some others in bash only:

    RESULT=$((RESULT + $?))
    RESULT=`bc <<< "$RESULT + $?"` 
    

    Anyway, exit status on error is not always 1 and its value does not depend on error level, so in the general case there is not much sense to check a sum of statuses against a threshold.

    0 讨论(0)
  • 2021-02-08 02:57

    A quick experiment and dip into bash info says:

    declare -i RESULT=$RESULT + $?
    

    since you are adding to the result several times, you can use declare at the start, like this:

    declare -i RESULT=0
    
    true
    RESULT+=$?
    false
    RESULT+=$?
    false
    RESULT+=$?
    
    echo $RESULT
    2
    

    which looks much cleaner.

    declare -i says that the variable is integer.

    Alternatively you can avoid declare and use arithmetic expression brackets:

    RESULT=$(($RESULT+$?))
    
    0 讨论(0)
  • 2021-02-08 03:10

    For how to add numbers in Bash also see:

    help let 
    
    0 讨论(0)
  • 2021-02-08 03:11

    You might want to take a look at the trap builtin to see if it would be helpful:

    help trap
    

    or

    man bash
    

    you can set a trap for errors like this:

    #!/bin/bash
    
    AllowedError=5
    
    SomeErrorHandler () {
        (( errcount++ ))       # or (( errcount += $? ))
        if  (( errcount > $AllowedError ))
        then
            echo "Too many errors"
            exit $errcount
        fi
    }
    
    trap SomeErrorHandler ERR
    
    for i in {1..6}
    do
        false
        echo "Reached $i"     # "Reached 6" is never printed
    done
    
    echo "completed"          # this is never printed
    

    If you count the errors (and only when they are errors) like this instead of using "$?", then you don't have to worry about return values that are other than zero or one. A single return value of 127, for example, would throw you over your threshold immediately. You can also register traps for other signals in addition to ERR.

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