K dispozici jsou dva typy bash pro smyčky. Jeden pomocí klíčového slova „in“ se seznamem hodnot, jiný pomocí programování v C, jako je syntaxe.
Tento článek je součástí naší probíhající série výukových programů pro bash.
Toto vysvětluje obě metody smyčky bash for a poskytuje 12 různých příkladů, jak používat smyčku bash for ve vašich skriptech shellu.
Uložte si tento článek do záložek pro budoucí použití, protože je to jediný článek, který by někdy potřeboval odkazovat na to, jak používat bash pro smyčky s příklady.
Metoda 1:Bash For Loop pomocí „in“ a seznamu hodnot
Syntaxe:
for varname in list do command1 command2 .. done
Ve výše uvedené syntaxi:
- pro, in, do a done jsou klíčová slova
- „seznam“ obsahuje seznam hodnot. Seznam může být proměnná, která obsahuje několik slov oddělených mezerami. Pokud v příkazu for chybí seznam, převezme poziční parametr, který byl předán do shellu.
- varname je libovolný název proměnné Bash.
V tomto formuláři příkaz for provede příkazy uzavřené v těle jednou pro každou položku v seznamu. Pokud například seznam hodnot obsahuje 5 položek, cyklus for se provede celkem 5krát, jednou pro každou položku v seznamu. Aktuální položka ze seznamu bude uložena do proměnné „varname“ při každém průchodu smyčkou. Tento „varname“ může být zpracován v těle cyklu for.
Metoda 2:Bash For Loop pomocí syntaxe podobné C
Druhá forma cyklu for je podobná smyčce for v programovacím jazyce „C“, která má tři výrazy (inicializace, podmínka a aktualizace).
for (( expr1; expr2; expr3 )) do command1 command2 .. done
Ve výše uvedeném bash pro syntaxi příkazu
- Před první iterací se vyhodnotí expr1. To se obvykle používá k inicializaci proměnných pro smyčku.
- Všechny příkazy mezi do a done se provádějí opakovaně, dokud není hodnota výrazu 2 TRUE.
- Po každé iteraci cyklu je vyhodnocen expr3. To se obvykle používá ke zvýšení čítače smyček.
Následujících 12 příkladů ukazuje, jak bashovat smyčky různými způsoby.
1. Statické hodnoty pro seznam za klíčovým slovem „v“
V následujícím příkladu je seznam hodnot (Po, Út, St, Čt a Pá) uveden přímo za klíčovým slovem „in“ ve smyčce bash for.
$ cat for1.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" done $ ./for1.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
Upozornění: Seznam hodnot by neměl být oddělen čárkou (Po, Út, St, Čt, Pá). Čárka bude považována za součást hodnoty. tj. Namísto „Po“ použije „Po“ jako hodnotu, jak je uvedeno v příkladu níže.
$ cat for1-wrong1.sh i=1 for day in Mon, Tue, Wed, Thu, Fri do echo "Weekday $((i++)) : $day" done $ ./for1-wrong1.sh Weekday 1 : Mon, Weekday 2 : Tue, Weekday 3 : Wed, Weekday 4 : Thu, Weekday 5 : Fri
Upozornění: Seznam hodnot by neměl být uzavřen do dvojitých uvozovek. („Po Út St Čt Pá“). Pokud uzavřete dvojité uvozovky, bude to považováno za jednu hodnotu (místo 5 různých hodnot), jak je znázorněno v příkladu níže.
$ cat for1-wrong2.sh i=1 for day in "Mon Tue Wed Thu Fri" do echo "Weekday $((i++)) : $day" done $ ./for1-wrong2.sh Weekday 1 : Mon Tue Wed Thu Fri
2. Proměnná pro seznam za klíčovým slovem „v“
Místo toho, abyste zadávali hodnoty přímo do cyklu for, můžete je uložit do proměnné a použít proměnnou ve smyčce for za klíčovým slovem „in“, jak ukazuje následující příklad.
$ cat for2.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in $weekdays do echo "Weekday $((i++)) : $day" done $ ./for2.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
Pozor :Jako osvědčený postup byste měli vždy uvádět proměnné bash, když je odkazujete. Z tohoto pravidla osvědčených postupů existuje několik výjimek. Toto je jeden z nich. Pokud v tomto cyklu for uvedete proměnnou do dvojitých uvozovek, bude se seznam hodnot považovat za jednu hodnotu. Do této pasti padne spousta lidí. Buďte opatrní a neuvádějte svou proměnnou do dvojitých uvozovek ve smyčce for.
$ cat for2-wrong.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in "$weekdays" do echo "Weekday $((i++)) : $day" done $ ./for2-wrong.sh Weekday 1 : Mon Tue Wed Thu Fri
3. Neuvádějte seznam; získat to z pozičních parametrů
Pokud nezadáte klíčové slovo „in“ následované seznamem hodnot v cyklu bash for, použije se poziční parametry (tj. argumenty, které jsou předány skriptu shellu).
$ cat for3.sh i=1 for day do echo "Weekday $((i++)) : $day" done $ ./for3.sh Mon Tue Wed Thu Fri Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
Upozornění: Při použití této metody buďte opatrní. Klíčové slovo „in“ byste neměli zahrnout do cyklu for. Pokud klíčové slovo „in“ ponecháte bez hodnot, nepoužije poziční parametr, jak je uvedeno níže. Do smyčky to nepůjde. tj. smyčka for se nikdy nespustí, jak je znázorněno v příkladu níže.
$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri
Poznámka :Více o pozičních parametrech bash naleznete v našem dřívějším článku.
4. Výstup příkazu Unix jako seznam hodnot za klíčovým slovem „in“
Výstup libovolného příkazu UNIX/Linux můžete použít jako seznam hodnot cyklu for uzavřením příkazu do back-ticks ` `, jak je uvedeno níže.
$ cat for4.sh i=1 for username in `awk -F: '{print $1}' /etc/passwd` do echo "Username $((i++)) : $username" done $ ./for4.sh Username 1 : ramesh Username 2 : john Username 3 : preeti Username 4 : jason ..
5. Procházet soubory a adresáře ve smyčce for
Chcete-li procházet soubory a adresáře v konkrétním adresáři, stačí cd do tohoto adresáře a do smyčky for zadejte *, jak je uvedeno níže.
Následující příklad projde všechny soubory a adresáře ve vašem domovském adresáři.
$ cat for5.sh i=1 cd ~ for item in * do echo "Item $((i++)) : $item" done $ ./for5.sh Item 1 : positional-parameters.sh Item 2 : backup.sh Item 3 : emp-report.awk Item 4 : item-list.sed Item 5 : employee.db Item 8 : storage Item 9 : downloads
Použití * ve smyčce bash for je podobné jako soubor globbing, který používáme v příkazovém řádku linuxu, když používáme příkaz ls (a další příkazy).
Například následující zobrazí všechny soubory a adresáře ve vašem domovském adresáři. Toto je koncept, který je použit ve výše uvedeném příkladu for5.sh.
cd ~ ls *
Následující zobrazí všechny soubory *.conf, které začínají buď a, b, nebo, c nebo d v adresáři /etc.
$ ls -1 /etc/[abcd]*.conf /etc/asound.conf /etc/autofs_ldap_auth.conf /etc/cas.conf /etc/cgconfig.conf /etc/cgrules.conf /etc/dracut.conf
Stejný argument, který je použit v příkazu ls výše, lze použít v cyklu bash for, jak je znázorněno v příkladu níže.
$ cat for5-1.sh i=1 for file in /etc/[abcd]*.conf do echo "File $((i++)) : $file" done $ ./for5-1.sh File 1 : /etc/asound.conf File 2 : /etc/autofs_ldap_auth.conf File 3 : /etc/cas.conf File 4 : /etc/cgconfig.conf File 5 : /etc/cgrules.conf File 6 : /etc/dracut.conf
6. Vymanit se ze smyčky for
Cyklus for můžete opustit pomocí příkazu „break“, jak je znázorněno níže.
$ cat for6.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" if [ $i -eq 3 ]; then break; fi done $ ./for6.sh Weekday 1 : Mon Weekday 2 : Tue
7. Pokračujte od vrcholu smyčky for
Za určitých podmínek můžete ignorovat zbytek příkazů ve smyčce for a pokračovat ve smyčce znovu shora (pro další hodnotu v seznamu) pomocí příkazu continue, jak je uvedeno níže.
Následující příklad přidá „(VÍKEND)“ k So a Ne a „(den v týdnu)“ ke zbytku dnů.
$ cat for7.sh i=1 for day in Mon Tue Wed Thu Fri Sat Sun do echo -n "Day $((i++)) : $day" if [ $i -eq 7 -o $i -eq 8 ]; then echo " (WEEKEND)" continue; fi echo " (weekday)" done $ ./for7.sh Day 1 : Mon (weekday) Day 2 : Tue (weekday) Day 3 : Wed (weekday) Day 4 : Thu (weekday) Day 5 : Fri (weekday) Day 6 : Sat (WEEKEND) Day 7 : Sun (WEEKEND)
8. Bash for loop pomocí syntaxe programu C
Tento příklad používá 2. metodu bash for smyčky, která je podobná syntaxi smyčky C for. Následující příklad vygeneruje 5 náhodných čísel pomocí cyklu for ve stylu bash C.
$ cat for8.sh for (( i=1; i <= 5; i++ )) do echo "Random number $i: $RANDOM" done $ ./for8.sh Random number 1: 23320 Random number 2: 5070 Random number 3: 15202 Random number 4: 23861 Random number 5: 23435
9. Infinite Bash for loop
Když nezadáte začátek, podmínku a přírůstek ve smyčce for ve stylu bash C, stane se nekonečnou smyčkou. Chcete-li smyčku zastavit, musíte stisknout Ctrl-C.
$ cat for9.sh i=1; for (( ; ; )) do sleep $i echo "Number: $((i++))" done
Jak jsme řekli výše, stiskněte Ctrl-C, abyste opustili tento příklad nekonečné smyčky bash.
$ ./for9.sh Number: 1 Number: 2 Number: 3
10. Použití čárky ve smyčce ve stylu bash C
Ve smyčce ve stylu bash c můžete kromě zvýšení hodnoty použité v podmínce zvýšit také nějakou jinou hodnotu, jak je uvedeno níže.
V sekci inicializace a inkrementální části smyčky for ve stylu bash C můžete mít více hodnot oddělením čárkou, jak je znázorněno níže.
Následující cyklus for se provede celkem 5krát pomocí proměnné i. Proměnná j však začíná číslicí 5 a při každém spuštění smyčky se zvýší o 5.
$ cat for10.sh for ((i=1, j=10; i <= 5 ; i++, j=j+5)) do echo "Number $i: $j" done $ ./for10.sh Number 1: 10 Number 2: 15 Number 3: 20 Number 4: 25 Number 5: 30
11. Rozsah čísel za klíčovým slovem „in“
Můžete procházet pomocí rozsahu čísel ve smyčce for „in“ pomocí expanze složených závorek.
Následující příklad prochází 10 krát s použitím hodnot 1 až 10.
$ cat for11.sh for num in {1..10} do echo "Number: $num" done $ ./for11.sh Number: 1 Number: 2 Number: 3 Number: 4 Number: 5 ...
12. Rozsah čísel s přírůstky za klíčovým slovem „in“
Následující příklad prochází 5krát s použitím hodnot 1 až 10 s přírůstkem 2. tj. začíná 1 a neustále se zvyšuje o 2, dokud nedosáhne 10.
$ cat for12.sh for num in {1..10..2} do echo "Number: $num" done $ ./for12.sh Number: 1 Number: 3 Number: 5 Number: 7 Number: 9
PS: Nezapomeňte si tento článek uložit do záložek pro budoucí použití.