Home > Enterprise >  How to exit a bash loop and stop the script but only when all the iterations are completed
How to exit a bash loop and stop the script but only when all the iterations are completed

Time:10-27

I have this code, which basically does a loop inside the DF command to see which disks are more than 90% full.

df -H | sed 1d  | awk '{ print $5 " " $1 }' | while read -r dfh; 
do 
    #echo "$output" 
    op=$(echo "$dfh" | awk '{ print $1}' | cut -d'%' -f1 ) 
    partition=$(echo "$dfh" | awk '{ print $2 }' ) 
    if [ $op -ge 90 ];  
    then 
        echo ">> ### WARNING! Running out of space on \"$partition ($op%)\" on $(hostname) as on $(date)" >> LOGFILE 
        echo -e ">> ### WARNING! Running out of space on \"$partition ($op%)\" on $(hostname) as on $(date)" 
        echo ">> There is not enough left storage in the disk to perform the upgrade, exiting..." >> LOGFILE 
        echo -e ">> There is not enough left storage in the disk to perform the upgrade, exiting..." 
        exit 1 
    elif [ $op -ge 85 ]; 
    then 
        echo -e ">> ### WARNING! Running out of space on \"$partition ($op%)\" on $(hostname) as on $(date)" >> LOGFILE 
        echo ">> ### WARNING! Running out of space on \"$partition ($op%)\" on $(hostname) as on $(date)" 
        echo ">> There enough left storage in the disk to perform the upgrade, but it is recommended to first increase the size of the disk $partition" >> LOGFILE 
        echo -e ">> There enough left storage in the disk to perform the upgrade, but it is recommended to first increase the size of the disk $partition"  
    fi 
done 
if [ "$?" -eq 1 ]; 
then 
    exit 
else 
    echo -e ">> There is enough left storage in the disk to continue with the upgrade, OK" 
fi

I want it to exit only if at least one disk is more than 90% full, that's the pourpose of the last if statement

The problem here is that the loop exits on the first disk recognised at more than 90%, this is bad because if I have 3 disks at more than 90% it will only report one of them (the first one in the loop) and then exit. Basically I want the script to report all the disks that are at 90% or more (and the ones that are at 85% too but without exiting, as you can read).

Is this possible? Thank you in advance

CodePudding user response:

You can do it in one check, like this:

$ a=10 b=5  c=7 ; (( a>=10 && b>=10 && c>=10 )) && echo 'all >= 10'
$ a=10 b=5  c=10; (( a>=10 && b>=10 && c>=10 )) && echo 'all >= 10'
$ a=10 b=10 c=10; (( a>=10 && b>=10 && c>=10 )) && echo 'all >= 10'
all >= 10

CodePudding user response:

Your script looks like it's screaming loudly to be refactored into Awk. But here is a more gentle refactoring.

rc=0
df -H |
awk 'NR>1 { n=$5; sub(/%/, "", n); print n, $1 }' |
while read -r op partition; 
do 
    if [ $op -ge 90 ];  
    then 
        tee -a LOGFILE <<-________EOF
    >> ### WARNING! Running out of space on "$partition ($op%)" on $(hostname) as on $(date)
    >> There is not enough left storage in the disk to perform the upgrade, exiting...
________EOF
        rc=1
    elif [ $op -ge 85 ]; 
    then
        tee -a LOGFILE <<-________EOF
    >> ### WARNING! Running out of space on "$partition ($op%)" on $(hostname) as on $(date)
    >> There enough left storage in the disk to perform the upgrade, but it is recommended to first increase the size of the disk $partition
________EOF
    fi
    [ "$rc" -eq 0 ]
done &&
echo ">> There is enough left storage in the disk to continue with the upgrade, OK" ||
exit 1

This keeps track of rc while looping over all the partitions, then proceeds with the final condition only when the loop is done.

Generally, avoid echo -e in favor of printf, though here, since the -e wasn't doing anything useful anyway, a here document worked better.

  • Related