V první části tohoto návodu Bash Scripting jsme diskutovali o tom, jak napsat Bash skript. Prozkoumali jsme různá použití a jedinečné scénáře, ve kterých se mohou Bash skripty hodit, což je skvělý příklad toho, jak neuvěřitelné mohou být.
V této části tutoriálu se podíváme na for
příkaz a while
příkaz. Ukážeme si, jak můžeme tyto příkazy použít k vytváření smyček pro iteraci sérií hodnot.
Smyčka For
V Linuxu je smyčka to, co používáme k opakovanému provádění příkazů v zadaném intervalu. Smyčky se ke stejnému účelu používají ve velkém množství programovacích jazyků.
V Linuxu existuje několik různých typů smyček, ale v této části článku se zaměříme na for
smyčka.
#!/bin/bash for y in a b c d w x y z > do > echo $y done
Jak můžete vidět na obrázku výše, přiřadili jsme proměnnou „y“ – což je jen bezvýznamný zástupný symbol používaný pro účely příkazu – několika písmenům abecedy.
Poté jsme tuto proměnnou předali do echo
příkaz a byl schopen vypsat naše písmena níže.
Iterace přes jednoduché hodnoty
Můžeme použít for
příkaz ve skriptu Bash. K tomu musíme nejprve vytvořit textový soubor v našem linuxovém terminálu. Můžete použít touch
příkaz pro snadné vytváření textových souborů.
$ touch script
Výše uvedená syntaxe vytvoří textový soubor, který budeme nazývat „script“. Ujistěte se, že jste vytvořili textový soubor pomocí .sh
rozšíření souboru. Po vytvoření script
, budeme chtít upravit v našem skutečném skriptu obsahujícím for
příkaz.
Můžeme toho dosáhnout spuštěním několika různých příkazů pro úpravu textových souborů, jako je nano
příkaz a vi
příkaz atd.
Doporučujeme však použít pouze nano
, protože je to jeden z nejjednodušších a nejsnadněji použitelných příkazových textových editorů v Linuxu.
$ nano script
Výše uvedená syntaxe otevře náš script
v textovém editoru nano. Zde budeme chtít napsat náš skript.
Upozorňujeme, že tento textový soubor musí obsahovat #!/bin/bash
, který informuje skript Bash o tom, který shell má použít, takže je klíčovou součástí úspěšného vytvoření skriptu Bash.
#!/bin/bash for var in first second third fourth fifth; do echo The $var item done
Opakování přes složité hodnoty
V předchozím příkladu jsme si ukázali, jak použít for
příkaz k iteraci jednoduchých hodnot v Bash skriptu vytvořeném uživatelem. Slovo jednoduchý zde odkazuje na hodnoty, které obsahují pouze jediné slovo.
Někdy však budete mít seznam, který obsahuje – namísto toho, co jsme viděli v předchozím příkladu s „prvním“ – něco ve smyslu „prvního“, který náhodou obsahuje více než jedno slovo pro jednu hodnotu. Tyto hodnoty nazýváme „komplexní“ hodnoty.
Pokud váš seznam tyto komplexní hodnoty obsahuje, budete je muset uvést v uvozovkách, aby skript pochopil, že jde pouze o jednu hodnotu.
#!/bin/bash for var in first "the second" "the third" "I’ll do it"; do echo "This is: $var" done
Náhrada příkazů
Můžeme také použít substituci příkazů v našem for
příkaz v našem skriptu Bash.
#!/bin/bash my_file="file01" for var in $(cat $my_file); do echo " $var" done
Zde jsme použili substituci příkazu subshellem Bash, jak je patrné z použití příkazu cat uvnitř $( )
; to nám umožňuje použít výstup z cat
a získejte obsah souboru za předpokladu, že každý řádek má jedno slovo.
Ale pokud jsou v jednom z těchto řádků mezery, každé slovo bude považováno za pole. V tomto případě budete muset shellu sdělit, aby nové řádky považoval za oddělovač namísto mezer.
Oddělovač polí
Ve výchozím nastavení jsou následující znaky prostředím Bash považovány za pole.
- Vesmír
- Tab
- nový řádek
Pokud váš text obsahuje některý z těchto znaků, shell bude předpokládat, že se jedná o nové pole, a pokud tyto znaky potřebujete použít, budete muset změnit interní oddělovač polí nebo proměnnou prostředí IFS.
$ IFS=$’n’
Výše uvedená syntaxe způsobí, že shell Bash bude považovat nové řádky za oddělovač namísto znaku mezery.
#!/bin/bash file="/etc/passwd" IFS=$'n' for var in $(cat $file); do echo " $var" done
Oddělovač polí můžete také přiřadit dvojtečkám pomocí IFS
jak je uvedeno níže.
$ IFS=:
Docela fantastické, co?
Iterace přes soubory adresáře
Můžete také použít for
smyčkou ve skriptu Bash, abyste vypsali soubory ve vašem domovském adresáři.
#!/bin/bash for obj in /home/ubuntu/*; do if [ -d "$obj" ]; then echo "$obj is a folder" elif [ -f "$obj" ]; then echo "$obj is a file" fi done
Tento proces vyžaduje, abyste použili if
příkaz ke kontrole souborů a složek. To by vám ale nemělo činit velký problém, pokud jste si přečetli předchozí příspěvek. Ale pokud byste si to náhodou potřebovali zopakovat, doporučoval bych si to přečíst.
V našem skriptu Bash jsme použili zástupný znak zvaný hvězdička (*), který obsahuje for
smyčka, která nám umožňuje zobrazit seznam souborů a složek v našem domovském adresáři. Ve skriptování Bash se tento proces nazývá „globování souborů .“ Soubor globbing znamená všechny existující soubory s názvem.
Všimněte si, že proměnné v našem if
příkazy jsou psány s uvozovkami, protože názvy souborů nebo složek mohou obsahovat mezery. Pokud bychom tento krok vynechali, možná bychom nebyli schopni vypsat všechny soubory a adresáře.
Iterujte přes řádky souboru
Můžeme použít for
smyčka ve skriptu Bash pro iteraci obsahu souboru:
#!/bin/bash IFS=$'n' for text in $(cat /etc/passwd); do echo "This line $text ++ contains" IFS=: for field in $text; do echo " $field" done done
Zde máme dvě smyčky, první smyčka iteruje přes řádky souboru a oddělovač je nový řádek, druhá iterace je přes slova na samotném řádku a oddělovač je dvojtečka :
data souboru
Tento nápad můžete použít, když máte soubor CSV nebo jakýkoli soubor s hodnotami oddělenými čárkami. Myšlenka je stejná; stačí změnit oddělovač tak, aby vyhovoval vašim potřebám.
Pro smyčku C-Style
Pokud jste obeznámeni s jazykem C, možná si všimnete, že na for
je něco trochu mimo v Linuxu občas zacyklí.
Důvodem je, že existují dva způsoby zápisu for
smyčky; standardní způsob Linuxu, který jsme již probrali na začátku tohoto tutoriálu, a způsob „ve stylu C“.
for (var= 0; var < 5; var++) { printf(“number is %dn”, var); }
Výše uvedená syntaxe je pro for
smyčka napsaná v C. for
ve stylu C smyčka v Linuxu je napsána velmi podobně jako tato s několika malými změnami, které lze pozorovat níže.
for (( proměnná =začátek; podmínka; krok iterace))
for (( var = 1; var < 5; var++ ))
Abychom pomohli lépe vykreslit obrázek, zahrneme příklad Bash skriptu ve stylu C for
smyčky v našem linuxovém terminálu.
#!/bin/bash for ((var = 1; var <= 10; var++)); do echo "number is $var" done
Vložte to do našeho textového souboru a spusťte to.
Příkaz Continue
Bash continue
příkaz ignoruje příkazy uvnitř vnější smyčky pro aktuální iteraci a předá řízení další iteraci. Tento příkaz můžete použít k zastavení provádění zbývajících příkazů uvnitř smyčky, aniž byste smyčku opustili.
V následujících několika příkladech se dostaneme k tomu, jak lze tento příkaz použít ve skriptovacích smyčkách Bash v Linuxu.
Příkaz Break
Příkaz break můžete použít k ukončení libovolné smyčky, jako jsou smyčky while a till.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
Cyklus běží, dokud nedosáhne 14, poté příkaz smyčku opustí.
Několik dalším příkladům tohoto příkazu se dostaneme o něco později.
The While Loop
Smyčka for není jediným způsobem smyčkování ve skriptování Bash. while
smyčka dělá stejnou práci, ale před každou iterací kontroluje podmínku. Struktura while
smyčku můžete vidět níže.
while [ condition ] do commands done
Uvedeme příklad se skriptem Bash.
#!/bin/bash number=10 while [ $number -gt 4 ]; do echo $number number=$(($number - 1)) done
Způsob, jakým tento Bash skript funguje, je jednoduchý; začíná znakem while
příkaz ke kontrole, zda je číslo větší než nula, pak spustí cyklus a hodnota čísla se sníží pokaždé o 1. Při každé iteraci smyčky skript vypíše hodnotu čísla. Cyklus bude probíhat, dokud toto číslo nedosáhne 0.
Vnořené smyčky
Smyčky můžete vytvářet uvnitř jiných smyček, jako je while
například smyčka. Tyto smyčky v rámci smyčky se nazývají vnořené smyčky. Ponoříme se do nich tak, že nejprve prozkoumáme, jak vytvořit vnořené for
smyčka v následujícím příkladu.
Více smyček for (vnořené pro)
V předchozích příkladech tohoto tutoriálu jsme si ukázali, jak vytvořit for
smyčky ve skriptu Bash v Linuxu. Existuje však také něco, čemu říkáme vnořené for
smyčky. Jedná se o smyčky v rámci jiných smyček, nebo jednoduše řečeno více smyček.
Ukážeme vám jednoduchý příklad, jak to vypadá, spolu s jeho krátkým prozkoumáním a popisem níže.
for y in a b c d e f do for u in a b c d e f do echo "$y$u" done done
Jak můžete vidět na obrázku výše, výstup, který obdržíme při spuštění našeho skriptu v terminálu příkazového řádku Linuxu, zní následovně:náš vzorový text v každém for
smyčka je „a b c d e f“.
Náš skript dělá echo textu ve vnější smyčce vedle textu z vnitřní smyčky.
Skript pokračuje ve výstupu prvního pole (v tomto případě mezery, vysvětlíme si to trochu později) textu ve vnější smyčce, dokud nebude vydáno každé pole obsažené ve vnitřní smyčce.
Po dokončení výstupu vnitřní smyčky začne náš skript Bash vydávat následující pole textu ve vnější smyčce.
Celý tento proces se bude opakovat, dokud nebude každé pole každé smyčky kompletně vytištěno ve výstupu vašeho linuxového terminálu.
Vícenásobná smyčka while (vnořená while)
Stejně jako vnořené for
příkazové smyčky, existuje také vnořený while
příkazové smyčky. Ty fungují úplně stejně jako vnořené smyčky pro for
příkaz; smyčka uvnitř jiné smyčky.
Níže uvedená syntaxe se bude nápadně podobat běžnému while
smyčka jako struktura vnořeného while
loop je jednoduše rozšířená forma základu while
smyčky, kterou lze pozorovat v syntaxi níže.
while [condition] do statements1 statements2 while [condition] do continue done statements3 done
Výše uvedená syntaxe bude provádět zadané úkoly, dokud nebudou splněny podmínky, které jste vybrali. Tomu se říká smyčka. Ale protože smyčka ve výše uvedeném příkladu je vnořená, znamená to, že jednou z úloh, které jsme zmínili výše, je další smyčka samotná.
Při dalším
Ukázali jsme, jak while
smyčka a for
smyčka může být velmi užitečná pro provádění složitých procesů pomocí Bash skriptů v Linuxu.
Někdy však z různých důvodů budete muset zabít jednu ze smyček ve skriptu Bash. Tento scénář, jakkoli to zní brutálně, se často vyskytuje při práci se správou systému. Takže byste se možná chtěli seznámit s tímto konceptem.
V shellu Bash, break
a continue
může poskytnout potřebné nástroje pro řízení toku vašich smyček skriptů Bash.
Na několika příkladech níže si ukážeme, jak tyto příkazy fungují jednotlivě.
Syntaxe pro použití brea
příkaz pro ukončení while
smyčka je následující:
$ while [ condition ] do commands continue done
continue
příkaz break
příkazy fungují velmi podobně a lze je považovat za vzájemné protiklady; continue
příkaz funguje přesně jako break
pouze pokračuje ve smyčce, místo aby ji zabil.
Ukončit smyčku
break
příkaz ukončí aktuální smyčku a předá řízení dalšímu příkazu po této smyčce. Tento proces můžete použít k ukončení smyček, jako je for
,while
, atd. Syntaxe break
příkaz je následující:
$ while [ condition ] do commands break done
Ale jak jsme zmínili výše, oba continue
příkaz a break
příkaz lze použít pro další smyčky skriptů Bash kromě while
smyčka. Ukážeme si, jak je používat v for
smyčka.
Konec pro smyčku
Tyto příkazy řízení smyčky můžete použít v for
smyčka. Použijeme break
příkaz pro ukončení for
smyčka v našem skriptu Bash.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
for
smyčka běží, dokud nedosáhne čísla, které jsme zadali ve skriptu bash, což je 14. Po dosažení našeho zadaného čísla se break
příkaz ukončí for
smyčka.
Příkaz Break If
Právě jsme ukázali, jak můžeme použít break
příkaz pro ukončení for
smyčky, ale tento příkaz můžeme také použít k ukončení if
příkaz uvnitř těchto smyček Bash skriptů.
i=0 while [[ $i -lt 10 ]] do echo "Number: $i" ((i++)) if [[ $i -eq 5 ]]; then break fi done
Pokračovat v prohlášení
Uděláme to samé, co jsme udělali v předchozím příkladu s continue
stejně jako u break
příkaz v while
smyčka ve skriptu Bash.
i=0 while [[ $i -lt 10 ]]; do ((i++)) if [[ "$i" == '5' ]]; then continue fi echo "Number: $i" done
Úvahy na závěr
Doufám, že jste se naučili novou nebo dvě věci. Nebo alespoň doufám, že jste si mohli zopakovat to, co už víte. Moje dnešní poslední slova pro vás by byla pokračovat ve čtení a cvičení.
Děkuji.