GNU/Linux >> Znalost Linux >  >> Linux

Skriptování prostředí Část 4:Struktury řízení opakování

Vítejte ve čtvrté části série výukových programů skriptování shellu HowtoForge (Kliknutím sem si přečtete část 1, část 2 a část 3 výukového programu). V této části pokryjeme různé struktury řízení opakování shellu bash a jak každou strukturu používat, a to pomocí několika příkladů. Začněme.

Úvod

Struktura řízení opakování, známá také jako struktura řízení smyčky, je typem struktury řízení v programovacích jazycích, která se používá ke zjednodušení opakujících se nebo rekurzivních úloh. Příkazy opakování optimalizují jakýkoli kód tím, že poskytují způsob, jak minimalizovat kód, což usnadňuje odstraňování problémů než nestrukturovaný kód poskytující stejný výstup. Existují tři typy cyklických příkazů, které bash shell podporuje – cykly for, while a till.

Pro smyčky

Cyklus for je cyklický příkaz, který používá klíčové slovo for k deklaraci opakujícího se příkazu. Bash podporuje různé syntaxe pro příkaz cyklu for:

Syntaxe 1:Struktura For-in

for <varName> in <list>
do
    #### your statement here
done

Tato syntaxe začíná klíčovým slovem for, poté následuje název proměnné, klíčové slovo in a seznam možných hodnot proměnné. Každá hodnota v seznamu bude oddělena mezerou a začátek řádků kódu, které se budou opakovat, je definován v do a končí klíčovým slovem done.

Vytvořme jednoduchý příkaz pro opakování, který uživateli umožní zadat 5 hodnot a získat součet čísel:

#!/bin/bash 
result=0;
input=0;
for var in 1 2 3 4 5
do
     printf "Input integer %d : " $var
     read input
     result=$((result+input))
done
echo "the result is " $result

V tomto příkladu proměnná var slouží jako čítač naší smyčky. Jeho hodnota je definována v seznamu čísel za klíčovým slovem in a shell mění hodnoty proměnné var po každém provedení cyklu v příkazu looping. Vzhledem k tomu, že v našem seznamu je pouze pět celočíselných hodnot, shell provede kódy uvnitř našeho cyklického příkazu pouze pětkrát.

Syntaxe 2:Pro opakování příkazu s hodnotami seznamu řetězců

Můžete také deklarovat proměnnou, která bude platit pro seznam položek vašeho počítadla. Zvažte například následující kód:

#!/bin/bash
list="var1 var2 var3 var4"
var=""
mkdir sample
cd sample
echo creating the "directories...."
for var in $list
do
     mkdir $var
done

Řádek list="var1 var2 var3 var4" definuje hodnoty proměnné list. Poté byl přiřazen k var v řádku pro var v $list a nakonec jsou adresáře vytvořeny v řádku mkdir $var.

Syntaxe 3:Pro příkaz smyčky se seznamem jako soubor

Můžete také načíst seznam z existujícího souboru a použít jej v příkazu pro opakování namísto jeho deklarování v kódu pomocí příkazu cat. Otevřete například svůj oblíbený textový editor a vypište alespoň pět názvů adresářů.

Dále otevřete novou kartu ve stejném textovém editoru a vytvořte nový skript. Tento skript by měl být uložen ve stejném adresáři, kde je uložen seznam adresářů, které jste dříve vytvořili.

#!/bin/bash 
dirList=$(cat list)
echo "creating directories...."
for var in $dirList
do
mkdir $var
done

Tento příklad se hodí, když musíte ve svém počítači se systémem Linux vytvořit stovky adresářů, nemyslíte?

Syntaxe 4:Syntaxe podobná C

for((initialization; boolean_test; increment/decrement))
do
#### your code goes here
done

Snad nejznámější strukturou smyčky for, kterou shell podporuje, je struktura podobná C. Cyklus začíná inicializací proměnné čítače a poté shell vyhodnotí booleovský výraz deklarovaný po inicializaci. Pokud je výsledek booleovského výrazu pravdivý, pak shell provede sadu příkazů uvnitř klauzule do, jinak ukončí cyklický příkaz a přejde na řádek za klíčovým slovem done. Shell postoupí k další iteraci prostřednictvím příkazu increment nebo decrement deklarovaného po booleovském testu. Jako příklad zrekonstruujeme náš první příklad pomocí této struktury.

#!/bin/bash 
result=0
input=0
for((var=1;var<=5;var++))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
done
echo $result

Příkaz při opakování

Příkaz while je typ opakující se struktury v bash, která využívá klíčové slovo while. Na rozdíl od syntaxe C-typu struktury smyčky for odděluje struktura while repetitivní řízení inicializaci, booleovský test a příkaz increment/decrement.

Syntaxe 1:Struktura While s podmíněnými příkazy založenými na aritmetických symbolech

<initialization>
while(condition)
do
    ###your code goes here
<increment/decrement>
done

Abychom mohli odlišit while od ostatních cyklických příkazů, zkonstruujme náš první příklad pro příkaz while.

#!/bin/bash
result=0
input=0
var=1
while((var <= 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

Když se podíváme na náš příklad, příkaz while začíná inicializací naší proměnné čítače var. Dále je za klíčovým slovem while deklarován booleovský test a uvnitř příkazů do a done bude deklarována sada příkazů, které se mají opakovat. V příkazech while interpret spustí a provede opakování kódů pouze v případě, že je výsledek booleovského testu pravdivý. Na druhou stranu, příkaz looping will ukončí iteraci kódů pouze v případě, že logický výraz bude mít hodnotu false.

Syntaxe 2:Příkaz While Looping s podmíněným příkazem založeným na mnemotechnické pomůcce

<initialization>
while [ <condition> ]
do
####your code goes here
<increment/decrement>
done

Můžete také deklarovat mnemotechnický podmíněný příkaz uvnitř příkazu while. Pro deklaraci bude místo závorky použita hranatá závorka. (Prohlédněte si podmíněné příkazy založené na mnemotechnických pomůckách zde ) Například:

#!/bin/bash 
var=1;
while [ $var -le 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

Syntaxe 3:Příkaz při opakování s podmíněným příkazem založeným na souboru

while read <variable_name>
do
####your code goes here
done <<path to the text file>

Stejně jako to, co jsme udělali v příkazu cyklování for, můžete také otevřít textový soubor a přiřadit ho k příkazu cyklování while. Například:

#!/bin/bash 
mkdir sample2
cd sample2
echo "creating directories..."
while read var
do
    mkdir $var
done<list

V tomto příkladu jsem zrecykloval seznam, který jsme před chvílí vytvořili, a vytvořil nový skript ve stejném adresáři. Pamatujte, že pokud je váš textový soubor umístěn v jiném adresáři, musíte za symbolem

Prohlášení Until Looping

Dalším typem cyklického příkazu, který bash podporuje, je struktura till. Příkaz till provede každý příkaz uvnitř smyčky, dokud booleovský výraz nedeklaruje výsledky jako false. Je to úplný opak příkazu while.

Syntaxe 1:Až do smyčky s podmíněným příkazem založeným na aritmetickém symbolu

until ((<conditional_statement>))
do
####set of commands
done

Uveďme příklad:

result=0 
input=0
var=1
until((var > 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

Syntaxe 2:Příkaz až do opakování s podmíněným příkazem založeným na mnemotechnické pomůcce

<initialization>
until [ <condition> ]
do
     ####your code goes here
<increment/decrement>
done

Vzhledem k tomu, že příkaz till je pravým opakem příkazu while looping, můžete také deklarovat podmíněný příkaz založený na mnemotechnických pomůckách ve struktuře till. Chcete-li však příkaz ukončit, musíte deklarovat opačný podmíněný příkaz - to znamená, aby byl podmíněný příkaz vyhodnocen na hodnotu false.

!/bin/bash 
result=0
input=0
var=1
until [ $var -gt 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

Závěr

Tato výuková část pokrývá tři struktury smyček, které bash podporuje – příkazy for, while a till. Každé z těchto tvrzení má jinou strukturu, použití a výhody. Bash podporuje různé struktury, poskytuje programátorům více možností, a proto se skriptování shellu snadno kóduje.


Linux
  1. Jak analyzovat Json pomocí skriptování Shell v Linuxu?

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

  3. Symbol backtick (`) v Linux Shell Scripting

  1. Deskriptory souborů a skriptování prostředí?

  2. Příkaz blokuje mechanismus ve skriptování Shell?

  3. Mám používat skriptování Apt nebo Apt-get In Shell?

  1. Vypsat všechny příkazy, které Shell zná?

  2. Jak porovnávat řetězce ve skriptování Bash Shell

  3. Získejte seznam názvů funkcí ve skriptu shellu