Pozor na nekonečné smyčky!
Schopnost smyčky je velmi výkonná funkce bash skriptování. Smyčky mají různé případy použití.
V tomto tutoriálu prozkoumáte tři různé struktury bashových smyček. Dozvíte se také, jak používat smyčky k procházení prvků pole.
Dále se naučíte, jak používat příkazy break a continue k ovládání smyček, a nakonec se naučíte, jak vytvářet nekonečné smyčky.
Pro smyčky v Bash
Smyčky For jsou jedním ze tří různých typů struktur smyček, které můžete použít v bash. Existují dva různé styly pro psaní cyklu for.
- Smyčky ve stylu C
- Použití smyčky for na seznamu/rozsahu položek
C-styl pro smyčky v bash
Pokud jste obeznámeni s programovacím jazykem podobným C nebo C++, pak poznáte následující syntaxi cyklu for:
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
Pomocí výše uvedené syntaxe ve stylu C vytiskne následující smyčka for desetkrát „Hello Friend“:
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
Smyčka for nejprve inicializovala celočíselnou proměnnou i na nulu pak testuje podmínku (i <10); je-li pravda, pak smyčka provede řádek echo „Hello Friend“ a zvýší proměnnoui od 1 a poté smyčka běží znovu a znovu, dokud i již není menší než 10 .
[email protected]:~$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Seznam/rozsah pro smyčky v Bash
Existuje také další varianta syntaxe smyčky for, která je zvláště užitečná, pokud pracujete se seznamem souborů (nebo řetězců), rozsahem čísel, poli, výstupem příkazu atd. Syntaxe seznamu/rozsahu pro smyčku má následující podobu :
for item in [LIST]; do
[COMMANDS]
done
Například následující smyčka for dělá přesně to samé jako smyčka for ve stylu C, kterou jste vytvořili v předchozí části:
for i in {1..10}; do
echo "Hello Friend"
done
Soubor var.sh skript níže vypíše všechny soubory a adresář, který existuje pod /var adresář:
#!/bin/bash
for i in /var/*; do
echo $i
done
Níže je ukázkový výstup při spuštění skriptu var.sh:
[email protected]:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
While Loops in Bash
Smyčka while je další populární a intuitivní smyčka, kterou můžete použít v bash skriptech. Obecná syntaxe smyčky while je následující:
while [ condition ]; do
[COMMANDS]
done
Například následující 3x10.sh skript používá smyčku while, která vypíše prvních deset násobků čísla tři:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Zde je výstup výše uvedeného skriptu:
[email protected]:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
Nejprve inicializovalčíslo proměnná na 1; pak smyčka while poběží tak dlouho jako num je menší nebo roven 10 . V těle cyklu while příkaz echo vypíše num vynásobeno tři a poté se zvýší num od 1 .
Until Loops in Bash
Pokud přicházíte z prostředí C/C++, možná hledáte smyčku do-while, ale ta v bash neexistuje.
V bash existuje další druh smyčky. Cyklus till má stejnou syntaxi jako cyklus while:
until [ condition ]; do
[COMMANDS]
Done
Klíčový rozdíl mezi smyčkou till a smyčkou while je v testovacím stavu. Smyčka while poběží tak dlouho, dokud je testovací podmínka pravdivá; na druhé straně bude smyčka do dokud nebude testovací podmínka nepravdivá!
Můžete například snadno vytvořit 3x10.sh skript se smyčkou dokud namísto smyčky while; trik je zde negovat podmínku testu:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Všimněte si, že negace testovací podmínky [ $num -le 10 ]; je [ $num -gt 10 ];
Další informace o opakování ve skriptech bash
Nyní, když jste obeznámeni se smyčkami v bash skriptech
Vytisknout obsah pole v bash
Pokud sledujete tuto sérii tutoriálů od začátku, měli byste být obeznámeni s poli v bash.
Cykly for jsou často nejoblíbenější volbou, pokud jde o iteraci prvků pole.
Například následující prime.sh skript iteruje a vytiskne každý prvek v primárním poli:
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
Toto je výstup skriptu prime.sh:
[email protected]:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
Použití Break and Continue in bash loops
Někdy můžete chtít smyčku předčasně ukončit nebo přeskočit iteraci smyčky. K tomu můžete použít příkazy break a continue.
Příkaz break ukončí provádění smyčky a přepne řízení programu na další příkaz nebo instrukci následující za smyčkou.
Například následující smyčka vytiskne pouze čísla od jedné do tří:
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
Můžete také použít pokračovat příkaz přeskočit iteraci smyčky. Cyklus pokračuje a přesune se k další iteraci, ale příkazy po příkazu continue jsou v této konkrétní iteraci přeskočeny.
Například následující odd.sh skript vypíše pouze lichá čísla od jedné do deseti, protože přeskakuje všechna sudá čísla:
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
Zde je výstup, který tiskne lichá čísla:
[email protected]:~$ ./odd.sh
1
3
5
7
9
Nekonečné smyčky v bash
Nekonečná smyčka je smyčka, která běží věčně; k tomu dojde, když je podmínka testu smyčky vždy pravdivá.
Ve většině případů jsou nekonečné smyčky produktem lidské logické chyby.
Například někdo, kdo může chtít vytvořit smyčku, která tiskne čísla 1 až 10 v sestupném pořadí, může skončit vytvořením následující nekonečné smyčky omylem:
for ((i=10;i>0;i++)); do
echo $i
done
Problém je v tom, že smyčka neustále inkrementuje proměnnoui od 1 . Chcete-li to opravit, musíte změnit i++ s i-- takto:
for ((i=10;i>0;i--)); do
echo $i
done
V některých případech můžete chtít záměrně vytvořit nekonečné smyčky, abyste čekali na splnění externí podmínky v systému. Nekonečnou smyčku for můžete snadno vytvořit následovně:
for ((;;)); do
[COMMANDS]
done
Pokud chcete místo toho vytvořit nekonečnou smyčku while, můžete ji vytvořit následovně:
while [ true ]; do
[COMMANDS]
done
Úžasný! Tím se dostáváme na konec tohoto tutoriálu v Bash Beginner Series. Doufám, že jste si užili opakování v bash!
Nyní procvičte smyčku pomocí několika jednoduchých cvičení. Řešení také získáte v níže uvedeném PDF.
Bash Kapitola 8 Cvičné otázkyProblémy a jejich řešení k procvičení toho, co jste se právě naučili v této kapitole Bash-Kapitola-8-Procvičení-otázek-Linux-Příručka.pdf28 KB
Podívejte se na další kapitolu, kde se dozvíte, jak znovu použít kód ve vašich bash skriptech vytvářením funkcí.