Ve skriptu shellu je mnoho případů, kdy chcete opakovaně provádět příkaz nebo skupinu příkazů, dokud nenastane určitá zadaná podmínka. Kromě toho můžete chtít provést skupinu příkazů pro každý prvek v určitém seznamu. Shell poskytuje tři smyčkové konstrukce pro tyto situace:konstrukce for, while a till.
Smyčka for umožňuje zadat seznam hodnot. Pro každou hodnotu v seznamu se provede skupina příkazů.
Pro syntaxi smyčky
Smyčka for v shellu bere jako argument seznam slov (řetězců). Počet slov v seznamu určuje, kolikrát jsou provedeny příkazy v cyklu for. Syntaxe cyklu for je:
for variable in element1 element2 element3 do commands done
kde:
- proměnná :Jde o libovolný název proměnné.
- prvky (seznam_argumentů) :Může to být jakýkoli seznam slov, řetězců nebo čísel a může být doslovný nebo generovaný pomocí příkazu shellu nebo metaznaku příkazového řádku shellu.
- příkazy :Příkazy mohou být libovolné příkazy operačního systému, uživatelský program, skript shellu nebo příkaz shellu, který vrací (vytváří) seznam.
Hodnota proměnné var je při prvním průchodu smyčkou nastavena na první slovo v seznamu. Při druhém průchodu smyčkou se jeho hodnota nastaví na druhé slovo v seznamu a tak dále. Cyklus se ukončí, když var postupně převezme každou z hodnot ze seznamu argumentů a nezůstávají žádné argumenty.
Seznam argumentů pro smyčku
Seznam argumentů ve smyčce for může být libovolný seznam slov , řetězce nebo čísla . Vygenerujte seznam argumentů pomocí libovolné z následujících metod (nebo kombinací metod):
- Použijte explicitní seznam
- Použijte obsah proměnné
- Používejte argumenty příkazového řádku
- Použijte substituci příkazů
- Při nahrazování příkazů používejte názvy souborů
Příklad 1 :Cyklus For s použitím Explicitního seznamu ke specifikaci argumentů
Když jsou argumenty uvedeny pro cyklus for, nazývají se explicitní seznam. Explicitní seznam je nejjednodušší formou seznamu argumentů. Cyklus se provede jednou pro každý prvek seznamu. Následující příklad je smyčka for využívající explicitní seznam prvků:
#!/bin/bash for fruit in apple orange banana peach kiwi do echo "Value of fruit is: $fruit" done
Výstup tohoto cyklu for je:
Value of fruit is: apple Value of fruit is: orange Value of fruit is: banana Value of fruit is: peach Value of fruit is: kiwi
Příklad 2:Pro smyčku s proměnným obsahem ke specifikaci argumentů
Když jsou argumenty v proměnné a příkaz je proveden, obsah proměnné se nahradí. V následujícím příkladu se text zadaný na výzvu stane hodnotou proměnné INPUT. Tato proměnná představuje seznam argumentů konstrukce for. Proto je text v INPUT rozdělen na slova nebo tokeny na základě mezer.
$ cat ex1.sh #!/bin/bash # Script name: ex1.sh echo "Enter some text: \c" read INPUT for var in $INPUT do echo "var contains: $var" done
$ ./ex1.sh Enter some text: I like the Bash shell. var contains: I var contains: like var contains: the var contains: Korn var contains: shell.
Příklad 3 :Cyklus For pomocí argumentů příkazového řádku ke specifikaci argumentů
V následujícím příkladu se text zadaný na příkazovém řádku stane seznamem argumentů konstruktu for. Proto je text příkazového řádku rozdělen na slova nebo tokeny na základě mezer.
$ cat ex2.sh #!/bin/bash # Script name: ex2.sh for var in $* do echo "command line contains: $var" done
$ ./ex2.sh I am The Geek. command line contains: I command line contains: am command line contains: The command line contains: Geek.
Příklad 4:Smyčka For Použití substituce příkazů k určení argumentů
Syntaxe pro substituci příkazů v prostředí Bash je:
for var in `cmd_sub`
Následující příklad používá výstup příkazu cat jako seznam argumentů.
$ cat fruit1 apple orange banana peach kiwi
$ cat ex4.sh #!/bin/bash # Script name: ex4.sh for var in `cat fruit2` do echo "var contains: $var" done
$ ./ex4.sh var contains: Apple var contains: Orange var contains: Banana var contains: Peach var contains: Kiwi
Pokud byl soubor obsahující seznam v následujícím formátu, jaký je výsledek cyklu for.
$ cat fruit3 Apple Orange Banana Peach Kiwi
$ cat ex5.sh #!/bin/bash # Script name: ex5.sh for var in `cat fruit3` do echo "$var" done
$ ./ex5.sh Apple Orange Banana Peach Kiwi
Ve výše uvedeném příkladu se výsledky nemění. Proměnná IFS je jakákoli mezera, takže každé pole v souboru odděluje jak návrat vozíku, tak mezera nebo tabulátor.
Příklad 5 :Cyklus pro použití názvů souborů v substituci příkazů ke specifikaci argumentů
Některé příkazy poskytují jako výstup názvy souborů a adresářů. V následujícím příkladu shell nahradí výstup příkazu, ls /etc/p*(/etc/passwd/etc/profilea tak dále), jako seznam argumentů pro cyklus for.
$ cat ex7.sh #!/bin/bash # Script name: ex7.sh for var in `ls /etc/p*` do print "var contains: $var" done
# ./x.sh var contains: /etc/passwd var contains: /etc/passwd- var contains: /etc/printcap var contains: /etc/profile ....Příklady smyček Bash if (if then fi, if then elif fi, if then else fi)