Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers

A bash shell támogatja hurkokhoz, amelyek lehetővé teszik az értéksorozatok iterációjának megszervezését. Ez az alapszerkezet ilyen ciklusok:

A var in list do parancsok készen állnak
A ciklus minden iterációjában a lista listából a következő érték kerül a var változóba. Ezért a ciklus első lépésében a lista első értéke kerül felhasználásra. A másodikban, a másodikban és így tovább, amíg a hurok el nem éri az utolsó elemet.

Iteráció egyszerű értékek felett

Talán a legegyszerűbb példa a for ciklusra a bash szkriptekben az, hogy egy egyszerű értékek listáján ismételjük meg:

#!/bin/bash for var első második harmadik negyedik ötödik do echo A $var elem kész
A szkript kimenete alább látható. Jól látható, hogy a lista elemei egymás után kerülnek a $var változóba. Ez addig történik, amíg a ciklus el nem éri az utolsót.


Egyszerű for loop

Kérjük, vegye figyelembe, hogy a $var változó a ciklusból való kilépéskor megtartja értékét, a tartalma változtatható, általában úgy dolgozhatunk vele, mint bármely más változóval.

Iteráció összetett értékek felett

A for ciklus inicializálására használt lista nem csak egy szóból álló egyszerű karakterláncokat tartalmazhat, hanem több szót és írásjelet tartalmazó teljes kifejezéseket is. Például mindez így nézhet ki:

#!/bin/bash for var az első "a második" " a harmadik" "Megcsinálom" do echo "Ez: $var" kész
Íme, mi történik, miután ez a ciklus ismétlődik a listán. Amint látja, az eredmény nagyon várt.


Iteráció összetett értékek felett
TNW-CUS-FMP - 10% kedvezményt biztosító promóciós kód szolgáltatásainkból, amely 7 napon belül aktiválható"

A ciklus inicializálása a parancs eredményeiből kapott listával

A for ciklus inicializálásának másik módja, ha egy listát adunk át neki, amely valamilyen parancs eredménye. Parancshelyettesítést használ ezek végrehajtásához és munkájuk eredményének eléréséhez.

#!/bin/bash file="myfile" for var for $(cat $file) do echo "$var" kész
Ez a példa a cat paranccsal olvassa be a fájl tartalmát. Az eredményül kapott értéklista átkerül a hurokba, és megjelenik a képernyőn. Kérjük, vegye figyelembe, hogy az általunk elért fájl újsorokkal elválasztott szavak listáját tartalmazza, szóközt nem használunk.


Hurok, amely egy fájl tartalmán át ismétlődik

Itt kell megjegyezni, hogy egy ilyen megközelítés, ha soronkénti adatfeldolgozás várható, nem fog működni egy bonyolultabb felépítésű fájl esetén, amelynek sorai több szót is tartalmazhatnak szóközzel elválasztva. A ciklus egyetlen szavakat dolgoz fel, nem sorokat.

Mi van, ha egyáltalán nem az, amit akarsz?

Mezőelválasztók

A fenti tulajdonság oka a különleges környezeti változó, amelyet IFS-nek (Internal Field Separator) hívnak, és lehetővé teszi mezőelválasztók megadását. Alapértelmezett bash shell a következő karaktereket mezőelválasztóként kezeli:
  • Hely
  • Tab jel
  • Soremelés karakter
Ha a bash ezen karakterek bármelyikével találkozik az adatokban, akkor azt feltételezi, hogy a listában a következő független érték előzi meg.

A probléma megoldása érdekében ideiglenesen módosíthatja az IFS környezeti változót. A bash szkriptben a következőképpen kell megtenni, feltéve, hogy csak egy újsorra van szüksége mezőelválasztóként:

IFS=$"\n"
Miután hozzáadta ezt a parancsot egy bash szkripthez, az megfelelően fog működni, figyelmen kívül hagyja a szóközöket és a tabulátorokat, és csak az újsorokat tekinti mezőelválasztónak.

#!/bin/bash file="/etc/passwd" IFS=$"\n" for var for $(cat $file) do echo " $var" kész
Ha ez a szkript fut, pontosan azt adja ki, ami tőle elvárható, így a ciklus minden iterációjában hozzáférést biztosít a fájlba írt következő sorhoz.


Egy fájl tartalmának soronkénti bejárása for ciklusban

Más karakterek is lehetnek határolók. Például fent megjelenítettük az /etc/passwd fájl tartalmát. A felhasználói adatok a sorokban kettősponttal vannak elválasztva. Ha az ilyen sorokat ciklusban kell feldolgoznia, az IFS a következőképpen konfigurálható:

Egy könyvtárban található fájlok bejárása

A bash szkriptekben a for ciklusok egyik leggyakoribb felhasználási módja a fájlok bejárása egy könyvtárban, és ezek feldolgozása.

Például a következőképpen listázhatja ki a fájlokat és mappákat:

#!/bin/bash for file in /home/likegeeks/* do if [ -d "$file" ] then echo "$file egy könyvtár" elif [ -f "$file" ] then echo "$file egy fájl" fi kész
Ha már foglalkozott a cikksorozat előző anyagával, meg kell értenie, hogyan működik az if-then konstrukció, és hogyan lehet megkülönböztetni egy fájlt a mappától. Ha nehéznek találja megérteni a fenti kódot, olvassa el újra ezt az anyagot.

Ezt fogja kiadni a szkript.


Egy mappa tartalmának listázása

Ügyeljen arra, hogyan inicializáljuk a ciklust, nevezetesen a mappacím végén található "*" helyettesítő karakterre. Ez a karakter helyettesítő karakterként fogható fel, ami azt jelenti, hogy "minden fájl bármilyen névvel". lehetővé teszi a mintának megfelelő fájlnevek automatikus helyettesítésének megszervezését.

Ha ellenőrizzük a feltételt egy if utasításban, a változó nevét idézőjelbe tesszük. Ez azért történik, mert a fájl vagy mappa neve szóközöket tartalmazhat.

C-stílus a hurkok számára

Ha ismeri a C programozási nyelvet, a bash for loops leírásának szintaxisa furcsának tűnhet, mivel nyilvánvalóan hozzászokott a ciklusok ilyen leírásához:

For (i = 0; i< 10; i++) { printf("number is %d\n", i); }
A Bash szkriptek használhatók ciklusokhoz, amelyek nagyon hasonlítanak a C-stílusú ciklusokhoz, de néhány eltéréssel. A ciklusdiagram hasonló megközelítéssel így néz ki:

For ((kezdeti változóérték; huroklezárási feltétel; változó változás))
Bash-ban ezt így lehet írni:

For ((a = 1; a< 10; a++))
És itt van egy működő példa:

#!/bin/bash for ((i=1; i<= 10; i++)) do echo "number is $i" done
Ez a kód 1 és 10 közötti számok listáját nyomtatja ki.

C-stílusú hurokműködés

míg hurok

A for konstrukció nem az egyetlen módja a ciklusok szervezésének a bash szkriptekben. Itt is használhatod a while ciklusokat. Egy ilyen ciklusban megadhat egy parancsot egy bizonyos feltétel ellenőrzésére, és addig hajthatja végre a ciklus törzsét, amíg az ellenőrzött feltétel nullát nem ad vissza, vagy valamilyen művelet sikeres befejezését jelzi. Amikor a hurokfeltétel nullától eltérő értéket ad vissza, ami hibát jelent, a ciklus leáll.

Itt van egy diagram a while ciklusok szerveződéséről
míg a feltételteszt parancsot
csináld
egyéb parancsok
Kész

Nézzünk egy példaszkriptet egy ehhez hasonló ciklussal:

#!/bin/bash var1=5, miközben [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] kész
A ciklus bejáratánál a $var1 változót ellenőrizzük, hogy nagyobb-e nullánál. Ha igen, akkor a ciklus törzse végrehajtódik, a változó értékéből levonva egyet. Ez minden iterációban megtörténik, miközben a változó értékét a módosítás előtt kiírjuk a konzolra. Amint a $var1 0 lesz, a ciklus leáll.

A while ciklus eredménye

Ha nem módosítja a $var1 változót, akkor a szkript végtelen ciklusba kerül.

Beágyazott hurkok

Bármilyen parancsot használhat a ciklustörzsben, beleértve más hurkok indítását is. Az ilyen konstrukciókat beágyazott huroknak nevezzük:

#!/bin/bash for ((a = 1; a<= 3; a++)) do echo "Start $a:" for ((b = 1; b <= 3; b++)) do echo " Inner loop: $b" done done
Az alábbiakban látható, hogy ez a szkript mit fog kiadni. Mint látható, először a külső ciklus első iterációja hajtódik végre, majd a belső három iterációja, ennek befejezése után ismét a külső ciklus lép működésbe, majd ismét a belső.

Beágyazott hurkok

Fájltartalom feldolgozása

Leggyakrabban beágyazott hurkokat használnak a fájlok feldolgozására. Tehát a külső ciklus a fájl sorain iterál, és a belső ciklus már minden sorral dolgozik. Például így néz ki az /etc/passwd fájl:

#!/bin/bash IFS=$"\n" a $(cat /etc/passwd) bejegyzéshez do echo "Értékek in $entry –" IFS=: a $entry értékéhez do echo " $value" kész Kész
Ennek a szkriptnek két ciklusa van. Az első ismétlődik a sorokon, és az újsor karaktert használja elválasztóként. A belső olyan karakterláncok elemzésével van elfoglalva, amelyek mezői kettősponttal vannak elválasztva.

Fájl adatfeldolgozás

Ez a megközelítés használható CSV formátumú fájlok vagy hasonló fájlok feldolgozásakor, és szükség szerint határoló karaktert ír az IFS környezeti változóba.

Ciklusmenedzsment

Lehetséges, hogy a ciklusba való belépés után le kell állítani, amikor a ciklusváltozó elér egy bizonyos értéket, amely nem felel meg az eredetileg beállított huroklezárási feltételnek. Meg kell-e várni a ciklus normális befejezését ilyen helyzetben? Természetesen nem, és ilyen esetekben a következő két parancs jól jön:
  • szünet
  • folytatni

szünet parancsot

Ez a parancs lehetővé teszi a ciklus végrehajtásának megszakítását. Használható ciklusokhoz és while ciklusokhoz is:

#!/bin/bash for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Number: $var1" kész
Egy ilyen ciklus normál körülmények között végigmegy a listából a teljes értéklistán. A mi esetünkben azonban a végrehajtása megszakad, ha a $var1 változó 5-tel egyenlő.

Korai kilépés a for ciklusból

Itt ugyanaz, csak a while ciklusra:

#!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi echo "Iteráció: $var1" var1=$(($var1 + 1)) kész
A break parancs, amelyet akkor hajtanak végre, amikor a $var1 értéke 5 lesz, megszakítja a hurkot. Ugyanaz a kimenet lesz, mint az előző példában, a konzolra.

folytassa a parancsot

Amikor ez a parancs a ciklus törzsében találkozik, az aktuális iteráció az ütemezés előtt véget ér, és a következő kezdődik anélkül, hogy kilépne a ciklusból. Nézzük a tovább parancsot a for ciklusban:

#!/bin/bash for ((var1 = 1; var1< 15; var1++)) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number: $var1" done
Ha a cikluson belüli feltétel igaz, vagyis ha a $var1 nagyobb, mint 5 és kisebb, mint 10, a shell végrehajtja a folytatás parancsot. Ez a huroktörzsben maradó parancsok kihagyásához és a következő iterációra való áttéréshez vezet.

folytassa a parancsot egy for ciklusban

Hurokban futó kimenet kezelése

A hurokban kiadott adat feldolgozható a kimenet átirányításával vagy a folyamatba való átadásával. Ez úgy történik, hogy a kész utasítás után a kimeneti feldolgozási parancsokat adjuk hozzá.

Például ahelyett, hogy a képernyőn jelenítené meg a ciklus kimenetét, az egészet beírhatja egy fájlba, vagy átadhatja valahová:

#!/bin/bash for ((a = 1; a< 10; a++)) do echo "Number is $a" done >myfile.txt echo "kész".
A shell létrehozza a myfile.txt fájlt, és átirányítja a for konstrukció kimenetét ehhez a fájlhoz. Nyissuk meg a fájlt, és győződjön meg arról, hogy pontosan azt tartalmazza, amit várunk.

A hurokkimenet átirányítása egy fájlba

Példa: Végrehajtók keresése

Használjuk a már leírtakat, és írjunk valami hasznosat. Például, ha meg kell tudnia, hogy pontosan mely végrehajtható fájlok állnak rendelkezésre a rendszeren, akkor a PATH környezeti változóba írt összes mappát átvizsgálhatja. Már megvan az ehhez szükséges eszközök teljes arzenálja, csak össze kell raknunk mindent:

#!/bin/bash IFS=: a $PATH mappához echo "$folder:" a $folder/* fájlhoz do if [ -x $file ] then echo "$file" fi kész kész
Egy ilyen kicsi és egyszerű szkript lehetővé tette a mappákban tárolt végrehajtható fájlok listájának beszerzését a PATH-ból.

Keressen végrehajtható fájlokat a mappákban a PATH változóból

Eredmények

Ma a bash szkriptek for and while ciklusairól beszéltünk, hogyan kell futtatni és vezérelni őket. Most már tudja, hogyan kell feldolgozni a karakterláncokat különböző elválasztókkal ciklusokban, tudja, hogyan irányíthatja át a hurokban lévő adatkimenetet fájlokra, hogyan tekintheti meg és elemezheti a könyvtárak tartalmát.

Feltéve, hogy Ön egy bash script fejlesztő, aki csak azt tudja róluk, ami ennek a cikksorozatnak az első részében és ebben a másodikban is szerepel, akkor már írhat valami hasznosat. Előttünk a harmadik rész, amellyel foglalkozva megtudhatja, hogyan adjunk át paramétereket és parancssori kapcsolókat a bash szkripteknek, és mit kezdjünk mindezzel.

A bash shell támogatja a ciklusokat, amelyek lehetővé teszik az értéksorozatok ismétlését. Íme az ilyen hurkok alapvető felépítése:

A var in list do parancsok készen állnak
A ciklus minden iterációjában a lista listából a következő érték kerül a var változóba. Ezért a ciklus első lépésében a lista első értéke kerül felhasználásra. A másodikban, a másodikban és így tovább, amíg a hurok el nem éri az utolsó elemet.

Iteráció egyszerű értékek felett

Talán a legegyszerűbb példa a for ciklusra a bash szkriptekben az, hogy egy egyszerű értékek listáján ismételjük meg:

#!/bin/bash for var első második harmadik negyedik ötödik do echo A $var elem kész
A szkript kimenete alább látható. Jól látható, hogy a lista elemei egymás után kerülnek a $var változóba. Ez addig történik, amíg a ciklus el nem éri az utolsót.


Egyszerű for loop

Kérjük, vegye figyelembe, hogy a $var változó a ciklusból való kilépéskor megtartja értékét, a tartalma változtatható, általában úgy dolgozhatunk vele, mint bármely más változóval.

Iteráció összetett értékek felett

A for ciklus inicializálására használt lista nem csak egy szóból álló egyszerű karakterláncokat tartalmazhat, hanem több szót és írásjelet tartalmazó teljes kifejezéseket is. Például mindez így nézhet ki:

#!/bin/bash for var in first "a második" "a harmadik" "Megcsinálom" do echo "Ez: $var" kész
Íme, mi történik, miután ez a ciklus ismétlődik a listán. Amint látja, az eredmény nagyon várt.


Iteráció összetett értékek felett
TNW-CUS-FMP - 10% kedvezményt biztosító promóciós kód szolgáltatásainkból, amely 7 napon belül aktiválható"

A ciklus inicializálása a parancs eredményeiből kapott listával

A for ciklus inicializálásának másik módja, ha egy listát adunk át neki, amely valamilyen parancs eredménye. Parancshelyettesítést használ ezek végrehajtásához és munkájuk eredményének eléréséhez.

#!/bin/bash file="myfile" for var for $(cat $file) do echo "$var" kész
Ez a példa a cat paranccsal olvassa be a fájl tartalmát. Az eredményül kapott értéklista átkerül a hurokba, és megjelenik a képernyőn. Kérjük, vegye figyelembe, hogy az általunk elért fájl újsorokkal elválasztott szavak listáját tartalmazza, szóközt nem használunk.


Hurok, amely egy fájl tartalmán át ismétlődik

Itt kell megjegyezni, hogy egy ilyen megközelítés, ha soronkénti adatfeldolgozás várható, nem fog működni egy bonyolultabb felépítésű fájl esetén, amelynek sorai több szót is tartalmazhatnak szóközzel elválasztva. A ciklus egyetlen szavakat dolgoz fel, nem sorokat.

Mi van, ha egyáltalán nem az, amit akarsz?

Mezőelválasztók

A fenti szolgáltatás oka az IFS (Internal Field Separator) nevű speciális környezeti változó, amely lehetővé teszi mezőelválasztók megadását. Alapértelmezés szerint a bash shell a következő karaktereket kezeli mezőelválasztóként:
  • Hely
  • Tab jel
  • Soremelés karakter
Ha a bash ezen karakterek bármelyikével találkozik az adatokban, akkor azt feltételezi, hogy a listában a következő független érték előzi meg.

A probléma megoldása érdekében ideiglenesen módosíthatja az IFS környezeti változót. A bash szkriptben a következőképpen kell megtenni, feltéve, hogy csak egy újsorra van szüksége mezőelválasztóként:

IFS=$"\n"
Miután hozzáadta ezt a parancsot egy bash szkripthez, az megfelelően fog működni, figyelmen kívül hagyja a szóközöket és a tabulátorokat, és csak az újsorokat tekinti mezőelválasztónak.

#!/bin/bash file="/etc/passwd" IFS=$"\n" for var for $(cat $file) do echo " $var" kész
Ha ez a szkript fut, pontosan azt adja ki, ami tőle elvárható, így a ciklus minden iterációjában hozzáférést biztosít a fájlba írt következő sorhoz.


Egy fájl tartalmának soronkénti bejárása for ciklusban

Más karakterek is lehetnek határolók. Például fent megjelenítettük az /etc/passwd fájl tartalmát. A felhasználói adatok a sorokban kettősponttal vannak elválasztva. Ha az ilyen sorokat ciklusban kell feldolgoznia, az IFS a következőképpen konfigurálható:

Egy könyvtárban található fájlok bejárása

A bash szkriptekben a for ciklusok egyik leggyakoribb felhasználási módja a fájlok bejárása egy könyvtárban, és ezek feldolgozása.

Például a következőképpen listázhatja ki a fájlokat és mappákat:

#!/bin/bash for file in /home/likegeeks/* do if [ -d "$file" ] then echo "$file egy könyvtár" elif [ -f "$file" ] then echo "$file egy fájl" fi kész
Ha már foglalkozott ezzel a cikksorozattal, meg kell értenie az if-then konstrukció szerkezetét, valamint azt, hogy hogyan lehet megkülönböztetni egy fájlt a mappától. Ha nehéznek találja megérteni a fenti kódot, olvassa el újra ezt az anyagot.

Ezt fogja kiadni a szkript.


Egy mappa tartalmának listázása

Ügyeljen arra, hogyan inicializáljuk a ciklust, nevezetesen a mappacím végén található "*" helyettesítő karakterre. Ez a karakter helyettesítő karakterként fogható fel, ami azt jelenti, hogy "minden fájl bármilyen névvel". lehetővé teszi a mintának megfelelő fájlnevek automatikus helyettesítésének megszervezését.

Ha ellenőrizzük a feltételt egy if utasításban, a változó nevét idézőjelbe tesszük. Ez azért történik, mert a fájl vagy mappa neve szóközöket tartalmazhat.

C-stílus a hurkok számára

Ha ismeri a C programozási nyelvet, a bash for loops leírásának szintaxisa furcsának tűnhet, mivel nyilvánvalóan hozzászokott a ciklusok ilyen leírásához:

For (i = 0; i< 10; i++) { printf("number is %d\n", i); }
A Bash szkriptek használhatók ciklusokhoz, amelyek nagyon hasonlítanak a C-stílusú ciklusokhoz, de néhány eltéréssel. A ciklusdiagram hasonló megközelítéssel így néz ki:

For ((kezdeti változóérték; huroklezárási feltétel; változó változás))
Bash-ban ezt így lehet írni:

For ((a = 1; a< 10; a++))
És itt van egy működő példa:

#!/bin/bash for ((i=1; i<= 10; i++)) do echo "number is $i" done
Ez a kód 1 és 10 közötti számok listáját nyomtatja ki.

C-stílusú hurokműködés

míg hurok

A for konstrukció nem az egyetlen módja a ciklusok szervezésének a bash szkriptekben. Itt is használhatod a while ciklusokat. Egy ilyen ciklusban megadhat egy parancsot egy bizonyos feltétel ellenőrzésére, és addig hajthatja végre a ciklus törzsét, amíg az ellenőrzött feltétel nullát nem ad vissza, vagy valamilyen művelet sikeres befejezését jelzi. Amikor a hurokfeltétel nullától eltérő értéket ad vissza, ami hibát jelent, a ciklus leáll.

Itt van egy diagram a while ciklusok szerveződéséről
míg a feltételteszt parancsot
csináld
egyéb parancsok
Kész

Nézzünk egy példaszkriptet egy ehhez hasonló ciklussal:

#!/bin/bash var1=5, miközben [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] kész
A ciklus bejáratánál a $var1 változót ellenőrizzük, hogy nagyobb-e nullánál. Ha igen, akkor a ciklus törzse végrehajtódik, a változó értékéből levonva egyet. Ez minden iterációban megtörténik, miközben a változó értékét a módosítás előtt kiírjuk a konzolra. Amint a $var1 0 lesz, a ciklus leáll.

A while ciklus eredménye

Ha nem módosítja a $var1 változót, akkor a szkript végtelen ciklusba kerül.

Beágyazott hurkok

Bármilyen parancsot használhat a ciklustörzsben, beleértve más hurkok indítását is. Az ilyen konstrukciókat beágyazott huroknak nevezzük:

#!/bin/bash for ((a = 1; a<= 3; a++)) do echo "Start $a:" for ((b = 1; b <= 3; b++)) do echo " Inner loop: $b" done done
Az alábbiakban látható, hogy ez a szkript mit fog kiadni. Mint látható, először a külső ciklus első iterációja hajtódik végre, majd a belső három iterációja, ennek befejezése után ismét a külső ciklus lép működésbe, majd ismét a belső.

Beágyazott hurkok

Fájltartalom feldolgozása

Leggyakrabban beágyazott hurkokat használnak a fájlok feldolgozására. Tehát a külső ciklus a fájl sorain iterál, és a belső ciklus már minden sorral dolgozik. Például így néz ki az /etc/passwd fájl:

#!/bin/bash IFS=$"\n" a $(cat /etc/passwd) bejegyzéshez do echo "Értékek in $entry –" IFS=: a $entry értékéhez do echo " $value" kész Kész
Ennek a szkriptnek két ciklusa van. Az első ismétlődik a sorokon, és az újsor karaktert használja elválasztóként. A belső olyan karakterláncok elemzésével van elfoglalva, amelyek mezői kettősponttal vannak elválasztva.

Fájl adatfeldolgozás

Ez a megközelítés használható CSV formátumú fájlok vagy hasonló fájlok feldolgozásakor, és szükség szerint határoló karaktert ír az IFS környezeti változóba.

Ciklusmenedzsment

Lehetséges, hogy a ciklusba való belépés után le kell állítani, amikor a ciklusváltozó elér egy bizonyos értéket, amely nem felel meg az eredetileg beállított huroklezárási feltételnek. Meg kell-e várni a ciklus normális befejezését ilyen helyzetben? Természetesen nem, és ilyen esetekben a következő két parancs jól jön:
  • szünet
  • folytatni

szünet parancsot

Ez a parancs lehetővé teszi a ciklus végrehajtásának megszakítását. Használható ciklusokhoz és while ciklusokhoz is:

#!/bin/bash for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Number: $var1" kész
Egy ilyen ciklus normál körülmények között végigmegy a listából a teljes értéklistán. A mi esetünkben azonban a végrehajtása megszakad, ha a $var1 változó 5-tel egyenlő.

Korai kilépés a for ciklusból

Itt ugyanaz, csak a while ciklusra:

#!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi echo "Iteráció: $var1" var1=$(($var1 + 1)) kész
A break parancs, amelyet akkor hajtanak végre, amikor a $var1 értéke 5 lesz, megszakítja a hurkot. Ugyanaz a kimenet lesz, mint az előző példában, a konzolra.

folytassa a parancsot

Amikor ez a parancs a ciklus törzsében találkozik, az aktuális iteráció az ütemezés előtt véget ér, és a következő kezdődik anélkül, hogy kilépne a ciklusból. Nézzük a tovább parancsot a for ciklusban:

#!/bin/bash for ((var1 = 1; var1< 15; var1++)) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number: $var1" done
Ha a cikluson belüli feltétel igaz, vagyis ha a $var1 nagyobb, mint 5 és kisebb, mint 10, a shell végrehajtja a folytatás parancsot. Ez a huroktörzsben maradó parancsok kihagyásához és a következő iterációra való áttéréshez vezet.

folytassa a parancsot egy for ciklusban

Hurokban futó kimenet kezelése

A hurokban kiadott adat feldolgozható a kimenet átirányításával vagy a folyamatba való átadásával. Ez úgy történik, hogy a kész utasítás után a kimeneti feldolgozási parancsokat adjuk hozzá.

Például ahelyett, hogy a képernyőn jelenítené meg a ciklus kimenetét, az egészet beírhatja egy fájlba, vagy átadhatja valahová:

#!/bin/bash for ((a = 1; a< 10; a++)) do echo "Number is $a" done >myfile.txt echo "kész".
A shell létrehozza a myfile.txt fájlt, és átirányítja a for konstrukció kimenetét ehhez a fájlhoz. Nyissuk meg a fájlt, és győződjön meg arról, hogy pontosan azt tartalmazza, amit várunk.

A hurokkimenet átirányítása egy fájlba

Példa: Végrehajtók keresése

Használjuk a már leírtakat, és írjunk valami hasznosat. Például, ha meg kell tudnia, hogy pontosan mely végrehajtható fájlok állnak rendelkezésre a rendszeren, akkor a PATH környezeti változóba írt összes mappát átvizsgálhatja. Már megvan az ehhez szükséges eszközök teljes arzenálja, csak össze kell raknunk mindent:

#!/bin/bash IFS=: a $PATH mappához echo "$folder:" a $folder/* fájlhoz do if [ -x $file ] then echo "$file" fi kész kész
Egy ilyen kicsi és egyszerű szkript lehetővé tette a mappákban tárolt végrehajtható fájlok listájának beszerzését a PATH-ból.

Keressen végrehajtható fájlokat a mappákban a PATH változóból

Eredmények

Ma a bash szkriptek for and while ciklusairól beszéltünk, hogyan kell futtatni és vezérelni őket. Most már tudja, hogyan kell feldolgozni a karakterláncokat különböző elválasztókkal ciklusokban, tudja, hogyan irányíthatja át a hurokban lévő adatkimenetet fájlokra, hogyan tekintheti meg és elemezheti a könyvtárak tartalmát.

Feltéve, hogy Ön egy bash script fejlesztő, aki csak azt tudja róluk, ami ebben a cikksorozatban, és ebben, a másodikban is szerepel, akkor már írhat valami hasznosat. Előttünk a harmadik rész, amellyel foglalkozva megtudhatja, hogyan adjunk át paramétereket és parancssori kapcsolókat a bash szkripteknek, és mit kezdjünk mindezzel.

A huroktípusok közötti különbség rövid leírása:

for - mindaddig végrehajt egy műveletet, amíg vannak végrehajtandó objektumok (például folyam olvasása stdin-ből, fájlból vagy függvényből);
míg - addig hajt végre egy műveletet feltétel igaz;
ig - ig hajtják végre feltétel nem lesz igaz, i.e. amíg hamis .

FOR hurok

Tekintsük a szkriptnek ezt a verzióját egy ciklussal:

$ cat loop.sh #!/bin/bash az `ls -1` változóhoz do echo "$variable" kész

A szintaxis nagyon egyszerű, és elég világosan látható a példában:

for (a ciklus indítása) változó (változó deklarálása a műveletek végrehajtásához) in (az áramlást a hurokra irányítja) `ls -1` (a parancs végrehajtása és átadása a $változó változónak). A Do és a kész a ciklus "teste", amelyen belül a kapott adatokon a fő műveletek végrehajtásra kerülnek, az echo "$változó" pedig maga a ciklus által végrehajtott művelet.

Most változtassunk egy kicsit a példán, és a parancs explicit megadása helyett a második változót alkalmazzuk:

$ cat loop.sh #!/bin/bash ls=`ls -1` a $ls változóhoz do echo "$variable" kész

Most az ls -1 parancsot egy külön változóban adjuk át, ami rugalmasabb munkát tesz lehetővé a hurokkal. A ciklusban szereplő változó helyett függvényt is használhat:

$ cat loop.sh #!/bin/bash lsl () ( ls -1 ) az `lsl` változóhoz do echo "$variable" kész

A for ciklus fő feltétele, hogy mindaddig végrehajtásra kerüljön, amíg a neki átadott parancsnak vannak műveleti objektumai. A fenti példa alapján - mindaddig, amíg vannak megjelenítendő fájlok az ls -1 listában - a ciklus átadja őket egy változónak, és végrehajtja a "loop body"-t. Amint a fájlok listája a könyvtárban véget ér, a ciklus befejezi a végrehajtást.

Bonyolítsuk egy kicsit a példát.

A könyvtár a fájlok listáját tartalmazza:

$ ls -1 fájl1 fájl2 fájl3 fájl4 fájl5 loop.sh nofile1 nofile2 nofile3 nofile4 nofile5

Csak azokat kell kiválasztanunk közülük, amelyekben nincs szó " nem«:

$ cat loop.sh #!/bin/bash lsl=`ls -1` a $lsl változóhoz do echo "$variable" | grep -v "nem" kész $ ./loop.sh fájl1 fájl2 fájl3 fájl4 fájl5 loop.sh

A ciklusban feltételes kifejezéseket is használhat ( feltételes kifejezések) […] a feltételek teszteléséhez, a break utasítás pedig a ciklus megszakításához, ha a feltétel aktiválódik.

Tekintsük ezt a példát:

$ cat loop.sh #!/bin/bash lsl=`ls -1` a $lsl változóhoz do if [ $variable != "loop.sh" ] then echo "$variable" | grep -v "nem" else break fi kész

A ciklus addig fut, amíg a loop.sh fájl nem találkozik. Amint a ciklus végrehajtása eléri ezt a fájlt, a ciklust megszakítja a break parancs:

$ ./loop.sh fájl1 fájl2 fájl3 fájl4 fájl5

Egy másik példa az aritmetikai műveletek használata közvetlenül a ciklustörzs végrehajtása előtt:

$ cat loop.sh #!/bin/bash for ((count=1; count<11; count++)) do echo "$count" done

Itt három vezérlőparancsot állítunk be - count=1 , egy vezérlési feltételt - miközben a szám kevesebb, mint 11, és egy végrehajtási parancsot - count +1:

WHILE és UNTIL hurkok

Egy egyszerű példa, amely bemutatja, hogyan működik jól a while ciklus:

$ cat loop.sh #!/bin/bash count=0 while [ $count -lt 10 ] do ((count++)) echo $count kész

A $count változót nullára állítjuk, ami után a whi le ciklust a „while $count kevesebb, mint tíz, ciklus” feltétellel futtatjuk. A huroktörzsben végrehajtjuk postfix növekmény+1 a $count változóra, és nyomtassa ki az eredményt az stdout -ba.

A végrehajtás eredménye:

$ ./loop.sh 1 2 3 4 5 6 7 8 9 10

Amint a $count változó értéke 10 lett, a ciklus leállt.

Egy jó példa a "végtelen" ciklusra, amely bemutatja, hogyan működik a while:

$ cat loop.sh #!/bin/bash count=10 while [ 1 = 1 ] do ((count++)) echo $count kész $ ./loop.sh ... 5378 5379 5380 5381 5382 5383 ^C

Hasonlóképpen, de ellenkező irányban, az till hurok is működik:

$ cat loop.sh #!/bin/bash count=0 amíg [ $count -gt 10 ] do ((count++)) echo $count kész

Itt is hasonló feltételt állítunk be, de a „amíg a változó nem éri el a 10-et” helyett azt jelöljük, hogy „amíg a változó 10-nél nagyobb lesz”. A végrehajtás eredménye:

$ ./loop.sh 1 2 3 4 5 6 7 8 9 10 11

Ha a fenti „végtelen hurok” példáját a till használatával hajtjuk végre, akkor nem ad ki semmit, ellentétben míg:

$ cat loop.sh #!/bin/bash count=10 amíg [ 1 = 1 ] do ((count++)) echo $count kész $ ./loop.sh $

Mert " feltétel" alapvetően " igaz» - a ciklus törzse nem kerül végrehajtásra.

A for ciklushoz hasonlóan a függvények a while és a till alatt is használhatók. Például egy hurok egy valóban használt szkriptből, amely ellenőrzi a szerver állapotát kandúr(A PID-t a rendszer veszi SLES, eltérhet más rendszereken), egy kissé leegyszerűsített változat:

$ cat loop.sh #!/bin/bash check_tomcat_status () ( RUN=`ps aux | grep tomcat | grep -v grep | grep java | awk "($2)"` ), míg a check_tomcat_status do if [ -n "$ RUN" ], majd printf "FIGYELMEZTETÉS: A Tomcat továbbra is a $RUN PID-vel fut." else printf "A Tomcat megállt, folyamatban...nn" break fi kész

A végrehajtás eredménye:

$ ./loop.sh FIGYELMEZTETÉS: A Tomcat továbbra is fut 14435 26548 PID-vel. FIGYELMEZTETÉS: A Tomcat továbbra is a 14435 26548 PID-vel fut. FIGYELMEZTETÉS: A Tomcat továbbra is a 14435 26548 PID-vel fut. FIGYELMEZTETÉS: A Tomcat továbbra is a PID 14435 26548. FIGYELMEZTETÉS: A Tomcat továbbra is a 14435 26548 PID-vel fut. FIGYELMEZTETÉS: A Tomcat továbbra is a 14435 PID-vel fut

Teljes verzió:

Check_tomcat_status () ( RUN=`ps aux | grep tomcat | grep -v grep | grep java | awk "($2 nyomtatása)"` ) miközben check_tomcat_status; do if [ -n "$RUN" ] then printf "FIGYELEM: A Tomcat továbbra is PID $RUN-nal fut. Leállítja? " válasz "A Tomcat leállítása..." "Telepítés folyamata..." && $CATALINA_HOME/bin/shutdown. sh 2&>1 /dev/null || break sleep 2 if [ -n "$RUN" ] then printf "A Tomcat még mindig fut. Öld meg? " válasz "Killing Tomcat..." "Telepítés folyamata...n" && kill $RUN || szünet alvás 2 fi else printf "A Tomcat leállt, folyamatban van...nn" break fi kész

A válasz funkciót a cikkben leírták, de itt egy kissé javított verziót használnak:

Válasz () (a válasz olvasása közben; a $válasz visszhangja |) printf "$1n" return 0 break ;; |) printf "$2n" return 1 break ;; *) printf "Kérjük, írjon be Y(igen) vagy N(nem)! " esac done )

Itt a while és a till is használható volt, de a for ciklus nem, mivel a for egyszer működne (a PID-t kapja - és end).

számára VAR ban ben 1 2 3...N csináld Kész vagy egy sorban: számára VAR ban ben 1 2 3...N; csináld ; Kész
Mind a számértékek, mind az ASCII karakterek behelyettesíthetők egy változóba.
Példa: $ i-re 1-ben 2 A B Abc ; do echo $i; kész 1 2 A B Abc Példa fájlok átvitelére egy változóba "maszkkal" videó átkódoláshoz: számáraén ban ben*.avi; csináld ; Kész

2. Egy másik parancs végrehajtásának eredményének behelyettesítése

számára VAR ban ben $(); csináld ; Kész
Példa a seq parancs eredményeinek használatára: számáraén ban ben$(seq[KEY]); csináld echo $i; Kész$ i-hez a $-ban (3. szekv.); do echo $i; kész 1 2 3 $ i-re $-ban (3 5. szekv.); do echo $i; kész 3 4 5 $ for i in $(seq 2 2 6); do echo $i; kész 2 4 6 Példa az ls parancs eredményeinek használatára: $ for i in $(ls /$HOME/Video); do echo $i; kész 001.avi 002.avi 003.avi

3. Helyettesítés C-stílussal

számára((EXPR1; EXPR2; EXPR3)) csináld <список команд> Kész számára((i=1; i<=3 ; i++)); csináld echo $i; Kész$ for ((i=1; i<=3 ; i++)); do echo $i; done 1 2 3 Подробнее о применении C-style в Bash

4. Felsorolás göndör kapcsos zárójelekkel (..)

A szintaxis (START..END) a bash 3.0+ verziója óta támogatott, a bash 4.0+ verzió óta pedig a szintaxis (START..END..INCREMENT) támogatott:

számára VAR ban ben {..} csináld Kész vagy számára VAR ban ben {....} csináld Kész Példák: $ for i in (1..3); do echo $i; kész 1 2 3 vagy $ for i in (4..8..2); do echo $i; kész 4 6 8 A számlálás az értékek növelésére és csökkentésére egyaránt lehetséges: $ i in (6..-4..3); do echo $i; kész 6 3 0 -3

5. Paraméter helyettesítés ( ban ben "$@")

Parancsokat hajt végre a parancsfájlnak átadott minden paraméterhez. számára VAR ban ben $@ csináld Kész vagy egy sorban: számára VAR ban ben $@; csináld ; Kész
Tehát ha létrehoz egy test.sh szkriptet #!/bin/sh számára VAR ban ben $@ csináld visszhang$var Kész majd paraméterekkel futtatva: $ ./test.sh param1 param2 param3 param1 param2 param3 rész ban ben$@ elhagyható. Ezután a test.sh szkript újra lesz írva: #!/bin/sh számára VAR csináld visszhang$var Kész
Íme néhány példa (pl ban benés nélküle): $ függvény FUNC_1 ( VAR esetén $@-ban; echo $VAR; kész; ) $ FUNC_1 param1 param2 param3 param1 param2 param3 $ függvény FUNC_2 ( VAR esetén; ne echo $VAR; kész; ) $ FUNC_2 param1 param2 param3 param1 param2 param3

6. Folytassa az alkalmazást, és törjön be egy for hurkot

A fenti konstrukciók mindegyike esetén lehetőség van a "continue" parancsokkal a ciklus következő elemére lépni, vagy a "break" parancsokkal kilépni a ciklusból.

Példa (vége, ha i=6, és nem fut le, ha i=3 és i=5): számára i in(1..8); csináld ha[ $i -eq 6 ]; akkor szünet; fi ha[ $i -eq 3 ] || [ $i -eq 5 ]; akkor folytatni; fi echo $i Kész Végrehajtás eredménye: $ $ for i in (1..8); do \ > if [ $i -eq 6 ]; majd megtörni; fi; \ > if [ $i -eq 3 ] || [ $i -eq 5 ]; majd folytassa; fi; \ > echo $i; \> kész 1 2 4

Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
OSSZA MEG: