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.
Existuje příkaz pro výpis všech názvů unixových skupin?
vložit obsah souboru do jiného (na konkrétní řádek souboru, který se odesílá)-BASH/LINUX