GNU/Linux >> Znalost Linux >  >> Linux

Bash skriptování – pro smyčku vysvětlenou s příklady

Ve skriptování shellu Bash jsou smyčky užitečné pro automatizaci opakujících se úloh. Když musíte ve skriptu opakovat úlohu N kolikrát, měly by být použity smyčky. Bash podporuje tři typy smyček.

  1. Pro smyčku
  2. Během smyčky
  3. Až do smyčky

Všechny tři cykly slouží ke stejnému účelu opakování úkolu N, kolikrát, když je podmínka splněna, ale s rozdíly v tom, jak jsou definovány a použity k dosažení výsledku.

Tento článek se zaměří na "cyklus for" ve skriptování Bash. O dalších dvou smyčkách se dozvíme v našem dalším průvodci.

Pro syntaxi smyčky

Než napíšete svůj první for loop, je velmi důležité porozumět syntaxi .

for NAME in [ LIST OF ITEMS ]
do
  Command 1
  Command 2
  .....
  Command N
done 

Pojďme to rozebrat a uvidíme, co to udělá.

  • Začněte klíčovým slovem "for" následovaný názvem proměnné.
  • Klíčové slovo "in" získat seznam položek a uložit jej do proměnné pro každou iteraci.
  • Klíčové slovo "do" a "done" označuje začátek a konec bloku smyčky a příkaz by měl být zapsán v do a hotovo.
  • Neexistují žádná přísná pravidla pro odsazení, ale pro lepší čitelnost použijte 2 mezery nebo tab(4) . V celém skriptu buďte konzistentní při používání mezery nebo tabulátoru.

Můžete také vytvořit jeden řádek pro smyčky. Vytvořte for loop v terminálu a stiskněte klávesu se šipkou nahoru a uvidíte, že bash jej automaticky převede na jednořádkovou smyčku.

for NAME in [ LIST OF ITEMS]; do COMMANDS ; done

Příklad 1 – Práce se seznamem položek

Začněme jednoduchým příkladem.

Z předchozí části jste možná pochopili, že for loop přijímá seznam položek. Seznam položek může být cokoli jako řetězce, pole, celá čísla, rozsahy, výstup příkazu atd.

Otevřete terminál a spusťte následující část kódu.

N=1
for val in Welcome To Ostechnix
do
 echo "Iteration $N → $val"
 ((++N))
done

Pojďme to rozebrat.

  • "Welcome to Ostechnix" je seznam položek předávaných do for loop a každé slovo bude vybráno jako samostatná iterace a uloženo do proměnné (val ).
  • Proměnná může být pojmenována jakkoli. Zde jej pojmenuji jako val .
  • V seznamu jsou tři položky, takže v for loop budou tři iterace a pokaždé hodnotu proměnné val je vytištěna.
  • Příkaz ((++N )) bude fungovat jako čítač a zvýší hodnotu proměnné N takže jej lze vytisknout v echo prohlášení.

Nyní po spuštění výše uvedeného for loop stiskněte na terminálu šipku nahoru a uvidíte víceřádkový for loop je převeden na jeden řádek pro smyčku.

Příklad 2 – Práce s rozsahy

Možná budete chtít spustit for loop N kolikrát, k tomu můžete použít bash vestavěný generátor sekvence "{x..y[..incr]}" která vygeneruje posloupnost čísel.

  • X =Počáteční celočíselná hodnota
  • Y =Koncová celočíselná hodnota
  • Incr =volitelná celočíselná hodnota, která inkrementuje celá čísla

Řekněme, že chcete spustit cyklus pětkrát, pak můžete použít následující úryvek.

for rng in {1..5}
do
 echo "Value is == $rng"
done

Můžete také použít volitelný parametr přírůstek, který bude provádět přírůstky po krocích.

Podívejte se na níže uvedený úryvek, kde je uveden přírůstek tři. Tím se vygeneruje sekvence od jedné a provede se krokový přírůstek o tři až do konečné hodnoty deset.

for rng1 in {1..10..3}
do
 echo "Value is == $rng1"
done

Příklad 3 – Spouštění příkazů

Můžete spustit libovolné příkazy, které odvozují seznam položek ke zpracování pomocí for loop . Příkaz by měl být buď označen zaškrtnutím "`` " nebo hranaté závorky "$() ".

."

V níže uvedeném příkladu spouštím příkaz, který získá ID procesu a odfiltruje posledních pět procesů. Smyčka For bude nyní iterovat každé ID procesu.

for list in $(ps -ef | awk {' print $2 '} | tail -n 5)
do 
  echo $list
done

Příklad 4 – Smyčka přes prvky pole

Ve scénářích v reálném čase uložíte některé hodnoty do polí a pokusíte se pole procházet smyčkou pro další zpracování.

Než pochopíte, jak iterovat polem, musíte porozumět chování dvou speciálních proměnných ( [email protected] a $* ). Obě jsou to speciální proměnné, které se používají pro přístup ke všem prvkům z pole.

Spusťte v terminálu následující část kódu. Pole X je vytvořen a když se pokusím vytisknout všechny hodnoty ($X ) stejně jako tisk proměnných, pouze vrací první hodnotu z pole.

$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16

Pro přístup ke všem prvkům v poli musíte buď použít [email protected] nebo $* . Syntaxe pro přístup k hodnotám pole bude následující.

$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week

Nyní to použijte s for loop iterovat hodnoty pole.

X=( 16 09 2021 "Thursday Third Week" )

for items in ${X[@]}
do
 echo $items
done

Podívejte se na výše uvedený výstup. Tento výstup se zdá být chybný, protože řetězec (čtvrtek třetí týden) uvnitř pole by měl být považován za jednu hodnotu. Zde je však každá položka považována za samostatnou položku.

Toto je výchozí chování, když používáte [email protected] nebo $ . Abyste tomu zabránili, uzavřete proměnnou rozšíření pole ([email protected] nebo $ ) ve dvojitých uvozovkách.

for items in "${X[@]}"
do
 echo $items
done

Když používáte dvojité uvozovky, [email protected] a $* chovat se jinak. Zatímco [email protected] rozšíří pole na každou položku v poli podobném, jak je znázorněno ve výše uvedeném příkladu $* rozšíří celé pole jako jednu hodnotu.

for items in "${X[*]}"
do
 echo $items
done

Pozor: Oba [email protected] a $* chovat se stejně, pokud není uzavřeno do dvojitých uvozovek . Zkuste se vyhnout $* pokud to není potřeba.

Příklad 5 – styl C pro syntaxi smyčky

Bash také nabízí c styl for loop syntax. Pokud jsou z C jazykové pozadí, pak pro vás tato syntaxe nebude nová.

Místo toho, abyste procházeli seznamem, budete vyhodnocovat podmínku, a pokud je podmínka pravdivá, budou provedeny příkazy v rámci cyklu.

V této syntaxi jsou tři parametry, kterým musíte rozumět.

  • Proměnná - Proměnná je inicializována pouze jednou při spuštění smyčky.
  • Stav - Podmínka by měla být pravdivá, aby se smyčka provedla, jinak se smyčka nespustí.
  • Počítadlo - Tím se zvýší hodnota proměnné.

Každý parametr by měl být oddělen středníkem (; ) a měl by být uzavřen ve dvojitých závorkách jak je uvedeno níže.

for (( variable; condition; counter ))
do
  Command 1 
  Command 2
  Command N 
done

Podívejte se na níže uvedený příklad přestupného roku.

  • Proměnná YEAR=2010 bude nejprve inicializováno.
  • Podmínka YEAR<=20 bude vyhodnocen a pokud je pravdivý, kód mezi do a done blok bude proveden.
  • Počítadlo YEAR++ zvýší rok o jeden počet. Do proměnné YEAR je zvýšen na 2020 , smyčka se bude opakovat.
  • V rámci do a done bloku, je napsán podmíněný příkaz, aby se zjistilo, zda je rok přestupný nebo ne.
for ((YEAR=2010; YEAR<=2020; YEAR++))
do
 if [[ $(expr $YEAR % 4) -eq 0 ]]
 then
   echo "$YEAR =  leap year"
 else
   echo "$YEAR =  not a leap year"
 fi
done

Příklad 6 – použití příkazu přerušení, pokračování

Existují dvě vestavěná klíčová slova bash, která se používají k řízení toku vašich smyček.

  • Přestávka - Opustí smyčku a přeskočí všechny čekající iterace.
  • Pokračovat – Přeskočte aktuální iteraci a předejte ovládací prvek zpět do cyklu for, aby se provedla další iterace.

Chcete-li zkontrolovat, zda jsou vestavěné bash nebo ne, použijte type příkaz:

$ type break continue
break is a shell builtin
continue is a shell builtin

Podívejme se ve stručnosti, jak a kde lze použít jak přerušení, tak pokračování.

K nalezení přestupného roku používám stejný kód, který jsem použil v předchozí části. V tomto případě potřebuji pouze to, co bude prvním přestupným rokem mezi roky 2010 a 2020. Pokud se tento rok najde, moje smyčka může skončit.

for ((YEAR=2010; YEAR<=2020; YEAR++))
do
 if [[ $(expr $YEAR % 4) -eq 0 ]]
 then
   echo "$YEAR =  leap year"
   break
 else
   echo "$YEAR =  not a leap year"
 fi
done

Z výše uvedeného výstupu můžete vidět for loop iteruje, a když je nalezen první přestupný rok 2012, break příkaz je přečten a smyčka je opuštěna a řízení je předáno zpět terminálu.

Nyní měním stejný kód pro "continue" prohlášení. continue příkaz, když je interpretován, přeskočí aktuální iteraci, tj. jakýkoli kód, který následuje po příkazu continue, a předá řízení zpět do for loop spustit další iteraci.

for ((YEAR=2010; YEAR<=2020; YEAR++))
do
 if [[ $(expr $YEAR % 4) -eq 0 ]]
 then
   echo "$YEAR =  leap year"
 else
   continue
   echo "$YEAR =  not a leap year"
 fi
done

Z obrázku výše můžete vidět, že existuje příkaz echo, který je příkazem continue přeskočen.

Příklad 7 – Skutečné použití příkazu

Když vytváříte smyčky nebo podmíněné příkazy, nemůžete nechat blok kódu prázdný. Bash vyvolá chybu syntaxe.

Podívejte se na oba výše uvedené obrázky. Na prvním obrázku jsem vytvořil for loop ale žádné příkazy mezi do a done . Podobně na druhém obrázku jsem nechal klauzuli else prázdnou. V obou případech bash nepřijímá prázdné bloky a vyvolává chyby syntaxe.

Můžete použít vestavěný bash “true" klíčové slovo, které bude vždy nastavovat výstupní kód na 0 (úspěch).

$ type true
true is a shell builtin

Tímto způsobem necháváte blok kódu prázdný, aniž by bash způsoboval nějaké chyby.

Závěr

V tomto průvodci smyčkou Bash for jsme začali úvodem do smyček a syntaxí for loop spolu se stylem C. Viděli jsme také, jak používat pro smyčky v různých podmínkách spolu s příkazy pro kontrolu smyčky break and continue. Podívejte se do našeho dalšího průvodce, kde se dozvíte o Bash While a Until smyčky s příklady.

  • Bash Scripting – smyčka Zatímco a dokud není vysvětlena příklady

Související čtení:

  • Bash Scripting – funkce vysvětlené na příkladech
  • Bash Scripting – proměnné vysvětlené na příkladech
  • Příkaz Bash Echo vysvětlený s příklady v Linuxu
  • Výukový program Bash Heredoc pro začátečníky
  • Přesměrování Bash vysvětleno na příkladech
  • Rozdíl mezi definováním proměnných Bash s exportem a bez exportu

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

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

  3. Bash for smyčky Příklady

  1. Bash For Loop

  2. Příkaz Linux mkdir vysvětlený pro začátečníky (s příklady)

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

  1. Bash For Loop s praktickými příklady

  2. Příkaz Bash Echo vysvětlený s příklady v Linuxu

  3. Bash přesměrování vysvětleno s příklady