GNU/Linux >> Znalost Linux >  >> Linux

Jak získat stav ukončení smyčky v bash

Něco takového?

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

Nebo takhle?

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

Skutečnou otázkou je rozhodnout, zda by měl být výstupní kód smyčky úspěšný nebo neúspěšný, pokud jedna iterace selže. Existují scénáře, kdy jeden dává větší smysl než druhý, a jiné, kde to není vůbec jasné.


Stav smyčky je stav posledního příkazu, který se provádí. K opuštění smyčky můžete použít break, ale pokud je přerušení úspěšné, bude stav smyčky 0 . Můžete však použít subshell a ukončit místo přerušení. Jinými slovy:

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

Můžete také vložit smyčku do funkce a vrátit z ní hodnotu. např.:

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

Manuál bash říká:

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

Poslední příkaz, který se provede uvnitř smyčka je break . A výstupní hodnota break je 0 (viz:help break ).

To je důvod, proč váš program stále končí s 0.


Linux
  1. Jak bezpečně získat verzi Ksh?

  2. Bash + Jak opustit sekundární skript a hlavní skript v obou případech?

  3. Bash:Smyčka, dokud se stav ukončení příkazu nerovná 0

  1. Jak napsat smyčku v Bash

  2. Jak potlačit výstup z Grepu, aby vrátil pouze stav ukončení?

  3. Jak získat masku sítě z bash?

  1. Jak zastavit skript Loop Bash v terminálu?

  2. Jak získat další informace o původu výstupního kódu?

  3. Jak získat Tty ve kterém Bash běží?