GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere lo stato di uscita un ciclo in bash

Qualcosa del genere?

while true; do
    case $RANDOM in *0) exit 27 ;; esac
done

O così?

rc=0
for file in *; do
    grep fnord "$file" || rc=$?
done
exit $rc

La vera domanda è decidere se il codice di uscita del ciclo debba essere un successo o un fallimento se un'iterazione fallisce. Ci sono scenari in cui uno ha più senso dell'altro e altri in cui non è affatto chiaro.


Lo stato del ciclo è lo stato dell'ultimo comando eseguito. Puoi usare break per uscire dal loop, ma se l'interruzione ha successo, lo stato del loop sarà 0 . Tuttavia, puoi usare una subshell ed uscire invece di rompere. In altre parole:

for i in foo bar; do echo $i; false; break; done; echo $?  # The loop succeeds
( for i in foo bar; do echo $i; false; exit; done ); echo $? # The loop fails

Puoi anche inserire il ciclo in una funzione e restituire un valore da essa. es:

in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }

Il manuale di bash dice:

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.[..]

L'ultimo comando che viene eseguito dentro il ciclo è break . E il valore di uscita di break è 0 (vedi:help break ).

Questo è il motivo per cui il tuo programma continua a terminare con 0.


Linux
  1. Come ottenere in sicurezza la versione di Ksh?

  2. Come sopprimere l'output da Grep, in modo che restituisca solo lo stato di uscita?

  3. Come fermare lo script Loop Bash nel terminale?

  4. Come ottenere ulteriori informazioni sull'origine di un codice di uscita?

  5. Bash:loop fino a quando lo stato di uscita del comando è uguale a 0

Bash continua:come riprendere un ciclo

Come utilizzare il comando di lettura Bash

Bash break:come uscire da un loop

Come ottenere la dimensione di una directory in Linux

Il ciclo Bash FOR spiegato e semplificato

Come ottengo la directory assoluta di un file in bash?