GNU/Linux >> Znalost Linux >  >> Linux

12 Bash pro příklady smyček pro vaše skriptování prostředí Linux

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í.


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. 5 nejlepších rozšíření prostředí GNOME pro vaši plochu Linuxu

  3. Jaký je váš oblíbený shell pro práci správce systému?

  1. Skriptování v Linuxu:3 postupy pro smyčky while v Bash

  2. Příklady Bash for Loop a While Loop

  3. Udržujeme vás ve smyčce – příklady opakování pro, Zatímco, dokud

  1. Bash For Loop

  2. Shell Scripting Část I:Začínáme se skriptováním bash

  3. Bash for smyčky Příklady