• Boolean a ve smyčce bash while. Proč v adresáři neběží smyčka for. Příklad: Vyhledejte spustitelné soubory

    pro VAR v 1 2 3...N dělat Hotovo nebo v jednom řádku: pro VAR v 123...N; dělat ; Hotovo
    Do proměnné je možné dosadit jak číselné hodnoty, tak znaky ASCII.
    Příklad: $ pro i v 1 2 A B Abc ; dělat echo $i; hotovo 1 2 A B Abc Příklad výpisu souborů v proměnné pomocí „masky“ pro překódování videa: pro i v*.avi; dělat ; Hotovo

    2. Nahrazení výsledků jiného příkazu

    pro VAR v $(); dělat ; Hotovo
    Příklad použití výsledků příkazu seq: pro i v$(seq [KLÍČ]); dělat echo $i; Hotovo$ pro i v $ (seq 3); dělat echo $i; hotovo 1 2 3 $ pro i v $ (seq 3 5); dělat echo $i; hotovo 3 4 5 $ za i v $ (následující 2 2 6); dělat echo $i; hotovo 2 4 6 Příklad použití výsledků příkazu ls: $ for i in $(ls /$HOME/Video); dělat echo $i; hotovo 001.avi 002.avi 003.avi

    3. Náhrada pomocí C-style (C-style)

    pro((EXPR1; EXPR2; EXPR3)) dělat <список команд> Hotovo pro((i=1; i<=3 ; i++)); dělat echo $i; Hotovo$ pro ((i=1; i<=3 ; i++)); do echo $i; done 1 2 3 Подробнее о применении C-style в Bash

    4. Výčet pomocí složených závorek (..)

    Syntaxe (START..END) je podporována od verze bash 3.0+ a syntaxe (START..END..INCREMENT) je podporována od verze bash 4.0+:

    pro VAR v {..} dělat Hotovo nebo pro VAR v {....} dělat Hotovo Příklady: $ for i in (1..3); dělat echo $i; hotovo 1 2 3 nebo $ za i in (4..8..2); dělat echo $i; hotovo 4 6 8 Počítání je možné jak pro inkrementaci, tak pro dekrementaci hodnot: $ for i in (6..-4..3); dělat echo $i; hotovo 6 3 0 -3

    5. Záměna parametrů ( v "$@")

    Provádí příkazy pro každý parametr, který byl předán skriptu. pro VAR v $@ dělat Hotovo nebo v jednom řádku: pro VAR v $@; dělat ; Hotovo
    Pokud tedy vytvoříte skript test.sh #!/bin/sh pro VAR v $@ dělat echo$ VAR Hotovo poté, když jej spustíte s parametry: $ ./test.sh param1 param2 param3 param1 param2 param3 Part v$@ lze vynechat. Poté bude skript test.sh přepsán: #!/bin/sh pro VAR dělat echo$ VAR Hotovo
    Dovolte mi uvést několik příkladů (s v a bez): $ funkce FUNC_1 ( pro VAR v $@; do echo $VAR; hotovo; ) $ FUNC_1 param1 param2 param3 param1 param2 param3 $ funkce FUNC_2 ( pro VAR; do echo $VAR; hotovo; ) $ FUNC_2 param1 param2 param3 param1 param2 param3

    6. Pomocí continue a break ve smyčce for

    Pro všechny výše uvedené konstrukce je možné použít příkazy "continue" pro přesun na další prvek smyčky nebo "break" pro ukončení smyčky.

    Příklad (dokončit, když i=6 a neprovádět, když i=3 a i=5): pro i v (1..8); dělat -li[ $i -eq 6]; pak přestávka; fi -li[ $i -eq 3 ] || [ $i -eq 5]; pak pokračovat; fi echo $i Hotovo Výsledek provedení: $ $ pro i in (1..8); do \ > if [ $i -eq 6 ]; pak zlomit; fi; \ > if [ $i -eq 3 ] || [ $i -eq 5]; pak pokračujte; fi; \ > echo $i; \ > hotovo 1 2 4

    Pozornost: V příspěvku jsou skryté výhody!

    pro smyčky

    Shell bash podporuje smyčky, které vám umožňují iterovat sekvence hodnot. Zde je základní struktura takových smyček:

    Pro var v seznamu proveďte příkaz hotovo

    V každé iteraci cyklu se do proměnné var zapíše další hodnota ze seznamu. První průchod smyčkou tedy použije první hodnotu ze seznamu. Ve druhé - druhé a tak dále - dokud smyčka nedosáhne posledního prvku.

    Iterace přes jednoduché hodnoty

    Snad nejjednodušším příkladem smyčky for v bash skriptech je iterace přes seznam jednoduchých hodnot:

    #!/bin/bash pro var v první druhé třetině čtvrté páté do echo Položka $var hotovo

    Výsledky tohoto skriptu jsou uvedeny níže. Jasně vidíte, že proměnná $var obsahuje prvky ze seznamu postupně. To se děje, dokud cyklus nedosáhne posledního z nich.



    Jednoduché pro smyčku

    Upozorňujeme, že proměnná $var si při výstupu ze smyčky zachovává svou hodnotu, její obsah lze měnit a obecně s ní lze pracovat jako s jakoukoli jinou proměnnou.

    Iterace přes komplexní hodnoty

    Seznam použitý k inicializaci cyklu for může obsahovat nejen jednoduché řetězce skládající se z jednoho slova, ale také celé fráze, které obsahují několik slov a interpunkčních znamének. Může to vypadat například takto:

    #!/bin/bash pro var v první "druhé" "třetí" "Udělám to" do echo "Toto je: $var" hotovo

    To se stane poté, co tato smyčka projde seznamem. Jak vidíte, výsledek je vcelku očekávaný.



    Iterace přes komplexní hodnoty
    TNW-CUS-FMP – promo kód na 10% slevu na naše služby, k dispozici pro aktivaci do 7 dnů“

    Inicializace smyčky se seznamem získaným z výsledků příkazu

    Dalším způsobem, jak inicializovat cyklus for, je předat mu seznam, který je výsledkem příkazu. Zde se k jejich provedení a získání výsledků jejich práce používá substituce příkazů.

    #!/bin/bash file="myfile" pro var v $(cat $file) do echo " $var" hotovo

    Tento příklad používá příkaz cat, který čte obsah souboru. Výsledný seznam hodnot je předán do smyčky a zobrazen na obrazovce. Vezměte prosím na vědomí, že soubor, ke kterému přistupujeme, obsahuje seznam slov oddělených novými řádky, nepoužívají se žádné mezery.



    Smyčka, která prochází obsahem souboru

    Zde musíme vzít v úvahu, že takový přístup, pokud se očekává řádkové zpracování dat, nebude fungovat pro soubor složitější struktury, jehož řádky mohou obsahovat více slov oddělených mezerami. Smyčka zpracuje jednotlivá slova, nikoli řádky.

    Co když to není to, co vůbec potřebujete?

    Polní separátory

    Důvodem výše uvedené funkce je speciální proměnná prostředí nazvaná IFS (Internal Field Separator), která umožňuje určit oddělovače polí. Ve výchozím nastavení bash shell považuje následující znaky za oddělovače polí:

    • Prostor
    • Znak tabulátoru
    • Znak posuvu řádku

    Pokud bash narazí na některý z těchto znaků v datech, předpokládá, že mu předchází další nezávislá hodnota v seznamu.

    Chcete-li problém vyřešit, můžete dočasně změnit proměnnou prostředí IFS. Zde je návod, jak to udělat ve skriptu bash, za předpokladu, že jako oddělovač polí potřebujete pouze nový řádek:

    IFS=$"n"

    Jakmile tento příkaz přidáte do svého bash skriptu, bude fungovat podle očekávání, bude ignorovat mezery a tabulátory a jako oddělovače polí bude nakládat pouze se znaky nového řádku.

    #!/bin/bash file="/etc/passwd" IFS=$"n" pro var v $(cat $file) do echo " $var" hotovo

    Pokud je tento skript spuštěn, vypíše přesně to, co je od něj požadováno, a v každé iteraci cyklu poskytne přístup k dalšímu řádku zapsanému do souboru.



    Procházení souboru po řádcích ve smyčce for

    Oddělovače mohou být i jiné znaky. Například výše jsme zobrazili obsah souboru /etc/passwd. Uživatelská data na řádcích jsou oddělena dvojtečkami. Pokud potřebujete zpracovat takové řetězce ve smyčce, IFS lze nakonfigurovat takto:

    Procházení souborů obsažených v adresáři

    Jedním z nejběžnějších použití smyček for v bash skriptech je procházení souborů umístěnými v adresáři a zpracování těchto souborů.

    Zde je například postup, jak zobrazit seznam souborů a složek:

    #!/bin/bash pro soubor v /home/likegeeks/* proveďte if [ -d "$soubor" ] potom echo "$soubor je adresář" elif [ -f "$soubor" ] a poté echo "$soubor je soubor" je hotovo

    Shell bash podporuje smyčky, které vám umožňují iterovat sekvence hodnot. Zde je základní struktura takových smyček:

    Pro var v seznamu proveďte příkaz hotovo
    V každé iteraci cyklu se do proměnné var zapíše další hodnota ze seznamu. První průchod smyčkou tedy použije první hodnotu ze seznamu. Ve druhé - druhé a tak dále - dokud smyčka nedosáhne posledního prvku.

    Iterace přes jednoduché hodnoty

    Snad nejjednodušším příkladem smyčky for v bash skriptech je iterace přes seznam jednoduchých hodnot:

    #!/bin/bash pro var v první druhé třetině čtvrté páté do echo Položka $var hotovo
    Výsledky tohoto skriptu jsou uvedeny níže. Jasně vidíte, že proměnná $var obsahuje prvky ze seznamu postupně. To se děje, dokud cyklus nedosáhne posledního z nich.


    Jednoduché pro smyčku

    Upozorňujeme, že proměnná $var si při výstupu ze smyčky zachovává svou hodnotu, její obsah lze měnit a obecně s ní lze pracovat jako s jakoukoli jinou proměnnou.

    Iterace přes komplexní hodnoty

    Seznam použitý k inicializaci cyklu for může obsahovat nejen jednoduché řetězce skládající se z jednoho slova, ale také celé fráze, které obsahují několik slov a interpunkčních znamének. Může to vypadat například takto:

    #!/bin/bash pro var v první "druhé" "třetí" "Udělám to" do echo "Toto je: $var" hotovo
    To se stane poté, co tato smyčka projde seznamem. Jak vidíte, výsledek je vcelku očekávaný.


    Iterace přes komplexní hodnoty
    TNW-CUS-FMP – promo kód na 10% slevu na naše služby, k dispozici pro aktivaci do 7 dnů“

    Inicializace smyčky se seznamem získaným z výsledků příkazu

    Dalším způsobem, jak inicializovat cyklus for, je předat mu seznam, který je výsledkem příkazu. Zde se k jejich provedení a získání výsledků jejich práce používá substituce příkazů.

    #!/bin/bash file="myfile" pro var v $(cat $file) do echo " $var" hotovo
    Tento příklad používá příkaz cat, který čte obsah souboru. Výsledný seznam hodnot je předán do smyčky a zobrazen na obrazovce. Vezměte prosím na vědomí, že soubor, ke kterému přistupujeme, obsahuje seznam slov oddělených novými řádky, nepoužívají se žádné mezery.


    Smyčka, která prochází obsahem souboru

    Zde musíme vzít v úvahu, že takový přístup, pokud se očekává řádkové zpracování dat, nebude fungovat pro soubor složitější struktury, jehož řádky mohou obsahovat více slov oddělených mezerami. Smyčka zpracuje jednotlivá slova, nikoli řádky.

    Co když to není to, co vůbec potřebujete?

    Polní separátory

    Důvodem výše uvedené funkce je speciální proměnná prostředí nazvaná IFS (Internal Field Separator), která umožňuje určit oddělovače polí. Ve výchozím nastavení bash shell považuje následující znaky za oddělovače polí:
    • Prostor
    • Znak tabulátoru
    • Znak posuvu řádku
    Pokud bash narazí na některý z těchto znaků v datech, předpokládá, že mu předchází další nezávislá hodnota v seznamu.

    Chcete-li problém vyřešit, můžete dočasně změnit proměnnou prostředí IFS. Zde je návod, jak to udělat ve skriptu bash, za předpokladu, že jako oddělovač polí potřebujete pouze nový řádek:

    IFS=$"\n"
    Jakmile tento příkaz přidáte do svého bash skriptu, bude fungovat podle očekávání, bude ignorovat mezery a tabulátory a jako oddělovače polí bude nakládat pouze se znaky nového řádku.

    #!/bin/bash file="/etc/passwd" IFS=$"\n" pro var v $(cat $file) do echo " $var" hotovo
    Pokud je tento skript spuštěn, vypíše přesně to, co je od něj požadováno, a v každé iteraci cyklu poskytne přístup k dalšímu řádku zapsanému do souboru.


    Procházení souboru po řádcích ve smyčce for

    Oddělovače mohou být i jiné znaky. Například výše jsme zobrazili obsah souboru /etc/passwd. Uživatelská data na řádcích jsou oddělena dvojtečkami. Pokud potřebujete zpracovat takové řetězce ve smyčce, IFS lze nakonfigurovat takto:

    Procházení souborů obsažených v adresáři

    Jedním z nejběžnějších použití smyček for v bash skriptech je procházení souborů umístěnými v adresáři a zpracování těchto souborů.

    Zde je například postup, jak zobrazit seznam souborů a složek:

    #!/bin/bash pro soubor v /home/likegeeks/* proveďte if [ -d "$soubor" ] potom echo "$soubor je adresář" elif [ -f "$soubor" ] a poté echo "$soubor je soubor" je hotovo
    Pokud jste pochopili předchozí materiál v této sérii článků, měli byste rozumět struktuře konstrukce if-then a také tomu, jak rozlišit soubor od složky. Pokud je pro vás obtížné výše uvedenému kódu porozumět, přečtěte si tento materiál znovu.

    To je to, co skript vypíše.


    Zobrazení obsahu složky

    Všimněte si, jak inicializujeme smyčku, konkrétně zástupný znak "*" na konci adresy složky. Tento symbol lze považovat za zástupný znak, který znamená: „všechny soubory s libovolnými názvy“. umožňuje vám organizovat automatické nahrazování názvů souborů, které odpovídají vzoru.

    Při testování podmínky v příkazu if uzavřeme název proměnné do uvozovek. To se děje proto, že název souboru nebo složky může obsahovat mezery.

    C-styl pro smyčky

    Pokud jste obeznámeni s programovacím jazykem C, syntaxe pro popis smyček bash for vám může připadat divná, protože jste zjevně zvyklí popisovat smyčky tímto způsobem:

    Pro (i = 0; i< 10; i++) { printf("number is %d\n", i); }
    V bash skriptech můžete použít pro smyčky, jejichž popis vypadá velmi podobně jako smyčky ve stylu C, i když existují určité rozdíly. Cyklický diagram s tímto přístupem vypadá takto:

    For ((počáteční hodnota proměnné; podmínka pro ukončení smyčky; změna proměnné))
    V bash to může být zapsáno takto:

    Pro ((a = 1; a< 10; a++))
    Zde je pracovní příklad:

    #!/bin/bash pro ((i=1; i<= 10; i++)) do echo "number is $i" done
    Tento kód vypíše seznam čísel od 1 do 10.

    Smyčka ve stylu C

    zatímco smyčka

    Konstrukce for není jediným způsobem, jak organizovat smyčky v bash skriptech. Můžete zde také použít smyčky while. V takové smyčce můžete zadat příkaz pro kontrolu určité podmínky a provést tělo smyčky, dokud testovaná podmínka nevrátí nulu nebo signál pro úspěšné dokončení určité operace. Když podmínka smyčky vrátí nenulovou hodnotu, což znamená chybu, smyčka se zastaví.

    Zde je schéma organizace smyček while
    zatímco příkaz pro kontrolu stavu
    dělat
    ostatní týmy
    Hotovo

    Podívejme se na příklad skriptu se smyčkou, jako je tato:

    #!/bin/bash var1=5 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] hotovo
    Na vstupu do smyčky se kontroluje, zda je proměnná $var1 větší než nula. Pokud ano, provede se tělo cyklu, ve kterém se jedna odečte od hodnoty proměnné. To se děje v každé iteraci a hodnotu proměnné vytiskneme do konzole, než dojde k její úpravě. Jakmile $var1 dosáhne hodnoty 0, smyčka se zastaví.

    Výsledek smyčky while

    Pokud neupravíte proměnnou $var1, skript skončí v nekonečné smyčce.

    Vnořené smyčky

    Můžete použít libovolné příkazy v těle smyčky, včetně spouštění dalších smyček. Takové konstrukce se nazývají vnořené smyčky:

    #!/bin/bash pro ((a = 1; a<= 3; a++)) do echo "Start $a:" for ((b = 1; b <= 3; b++)) do echo " Inner loop: $b" done done
    Níže je uveden výstup tohoto skriptu. Jak vidíte, nejprve se provede první iterace vnější smyčky, poté tři iterace vnitřní smyčky, po jejím dokončení přichází na řadu opět vnější smyčka, poté opět vnitřní.

    Vnořené smyčky

    Zpracování obsahu souboru

    Nejčastěji se ke zpracování souborů používají vnořené smyčky. Vnější smyčka tedy iteruje přes řádky souboru a vnitřní smyčka již pracuje s každým řádkem. Zde je například, jak vypadá zpracování souboru /etc/passwd:

    #!/bin/bash IFS=$"\n" pro položku v $(cat /etc/passwd) do echo "Hodnoty v $entry –" IFS=: pro hodnotu v $entry do echo " $value" hotovo Hotovo
    V tomto skriptu jsou dvě smyčky. První prochází řádky pomocí znaku nového řádku jako oddělovače. Vnitřní je zaneprázdněno analýzou řetězců, jejichž pole jsou oddělena dvojtečkami.

    Zpracování dat souboru

    Tento přístup lze použít při zpracování souborů CSV nebo jakýchkoli podobných souborů zapsáním oddělovacího znaku do proměnné prostředí IFS podle potřeby.

    Řízení cyklu

    Možná, že po vstupu do smyčky ji budete muset zastavit, když proměnná smyčky dosáhne určité hodnoty, která neodpovídá původně zadané podmínce pro ukončení smyčky. Bude v takové situaci nutné čekat na normální dokončení cyklu? Samozřejmě ne a v takových případech se budou hodit následující dva příkazy:
    • přestávka
    • pokračovat

    příkaz přerušení

    Tento příkaz umožňuje přerušit provádění smyčky. Lze jej použít pro smyčky for a while:

    #!/bin/bash pro var1 v 1 2 3 4 5 6 7 8 9 10 proveďte if [ $var1 -eq 5 ] a poté přerušte fi echo "Číslo: $var1" hotovo
    Taková smyčka za normálních podmínek projde celým seznamem hodnot ze seznamu. V našem případě však bude jeho provádění přerušeno, když je proměnná $var1 rovna 5.

    Předčasné ukončení cyklu for

    Zde je to samé, ale pro smyčku while:

    #!/bin/bash var1=1 while [ $var1 -lt 10 ] proveďte if [ $var1 -eq 5 ] then break fi echo "Iterace: $var1" var1=$(($var1 + 1)) hotovo
    Příkaz break, který se provede, když $var1 dosáhne 5, přeruší smyčku. Konzole zobrazí to samé jako v předchozím příkladu.

    pokračovat příkazem

    Když je tento příkaz nalezen v těle smyčky, aktuální iterace skončí dříve a začne další, aniž by se smyčka opustila. Podívejme se na příkaz continue ve smyčce for:

    #!/bin/bash pro ((var1 = 1; var1< 15; var1++)) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number: $var1" done
    Když je splněna podmínka uvnitř smyčky, tedy když $var1 je větší než 5 a menší než 10, shell provede příkaz continue. To má za následek přeskočení zbývajících příkazů v těle smyčky a přechod k další iteraci.

    Příkaz continue ve smyčce for

    Výstup zpracování běží ve smyčce

    Výstup dat ze smyčky lze zpracovat buď přesměrováním výstupu, nebo jeho předáním do potrubí. To se provádí přidáním příkazů pro zpracování výstupu za příkaz done.

    Například místo zobrazení výstupu ve smyčce na obrazovce můžete vše zapsat do souboru nebo předat jinam:

    #!/bin/bash pro ((a = 1; a< 10; a++)) do echo "Number is $a" done >myfile.txt echo "dokončeno."
    Shell vytvoří soubor myfile.txt a přesměruje výstup příkazu for do tohoto souboru. Otevřete soubor a ujistěte se, že obsahuje přesně to, co očekáváme.

    Přesměrovat výstup smyčky do souboru

    Příklad: Vyhledejte spustitelné soubory

    Využijme toho, co jsme již probrali, a napišme něco užitečného. Pokud například potřebujete zjistit, které spustitelné soubory jsou v systému k dispozici, můžete prohledat všechny složky zaznamenané v proměnné prostředí PATH. Již máme celý arzenál nástrojů, které k tomu potřebujeme, jen to musíme dát dohromady:

    #!/bin/bash IFS=: pro složku v $PATH udělat echo "$folder:" pro soubor ve $složce/* udělat if [ -x $file ] potom echo " $soubor" fi hotovo
    Tento malý a jednoduchý skript nám umožnil získat seznam spustitelných souborů uložených ve složkách z PATH.

    Vyhledávání spustitelných souborů ve složkách z proměnné PATH

    Výsledek

    Dnes jsme mluvili o smyčkách for a while v bash skriptech, jak je spouštět a jak je spravovat. Nyní víte, jak zpracovávat řetězce s různými oddělovači ve smyčkách, víte, jak přesměrovat výstup dat ve smyčkách do souborů, jak prohlížet a analyzovat obsah adresářů.

    Pokud předpokládáme, že jste vývojář bash skriptů, který o nich ví jen to, co je uvedeno v první části této série článků a v této druhé, pak už můžete napsat něco užitečného. Před námi je třetí díl, po jehož pochopení se naučíte, jak předávat parametry a přepínače příkazového řádku do bash skriptů a co s tím vším dělat.

    Jedno ze základních pravidel správy systému lze vyjádřit takto: pokud potřebujete dělat to samé znovu a znovu, napište skript a nechte jej, aby to udělal za vás. Pokud potřebujete provést nějakou akci ve skriptu několikrát, měli byste použít cykly. V GNU Bash můžete vytvářet smyčky pomocí konstruktů pro, zatímco A až do.

    Pokud jste se někdy zajímali o programování, pak s největší pravděpodobností tyto konstrukce již znáte. Pokud jako já studujete Bash Bez jakýchkoli zkušeností s programováním nemusí být použití smyček dostatečně zřejmé, aby bylo možné porozumět. Začněme definováním rozdílů mezi různými typy smyček a poté přejdeme k příkladům.

    Cyklus pro je navržen tak, aby opakoval akce, dokud nejsou všechny dokončeny. Představte si například, že máte katalog obrázků a potřebujete je převést z jednoho formátu do druhého. Můžete použít smyčku pro společně s programem konvertovat z balíčku ImageMagick(nebo nějaký jiný program), například za účelem převodu obrázků z formátu JPEG do formátu PNG. Nebo můžete například potřebovat převést mnoho zvukových souborů z MP3 PROTI OGG Vorbis.

    Cyklus zatímco slouží k opakování akcí sbohem je proveden (je skutečný) nějakou podmínku. Cyklus až do funguje trochu jinak: provádí akci až do dokud nebude splněna podmínka. Můžete tedy mít například počítadlo a provést akci až do, dokud jeho hodnota nedosáhne 10. Podívejme se na to podrobněji na příkladech.

    Začněme cyklem pro. Jeho formát je:

    Pro i v $(příkaz); udělat příkaz $i; Hotovo

    Pokud používáte smyčku pro ve skriptu je lepší jej naformátovat takto:

    #!/bin/bash pro i v $(příkaz); udělat příkaz $i hotovo

    Pokud tedy například potřebujete vytvořit záložní kopie všech souborů HTML umístěných v adresáři, můžete použít následující příkaz:

    Pro i v $(ls *html); do cp $i $i.bak; Hotovo

    Zde se vytvoří lokální proměnná $i, příkaz se provede ls *html, jehož výsledkem budou data, která inicializují hodnotu proměnné $i při každé iteraci smyčky (v našem příkladu to bude seznam souborů vrácených příkazem ls, jeden pro každou iteraci). Dále se provede příkaz cp, kterému se mezi parametry předává proměnná $i.

    Někteří se mohou ptát, zda je nutné použít dopis "já" jako název proměnné? Ne. Můžete použít jakýkoli správný Bash název proměnné. Samozřejmě je lepší používat ve skriptech smysluplnější názvy proměnných, např $vstup nebo $html.

    Uvedl jsem velmi krátký a jednoduchý příklad použití smyčky pro. Místo příkazu provedeného v bloku dělat,použití echo abyste viděli parametry, které mu byly předány. Toto je velmi užitečný postup během testovací fáze skriptů a je to také dobrý způsob, jak vám pomoci porozumět práci podrobněji. pro.

    dokud a dokud

    Podívejme se nyní na konstrukce zatímco A až do. Také trochu použijeme podmínky bash. V našem příkladu je využijeme ke zjištění například, zda je hodnota proměnné větší nebo menší než číslo X; zda soubor existuje a zda se jedná o adresář. Můžete také použít podmíněné výrazy, abyste například určili, zda je soubor čitelný nebo zda má soubor ve svých oprávněních bit GID.

    Zkusme něco jednoduchého, třeba vytvořit nějaké prázdné soubory. Je nepravděpodobné, že by vám to bylo v životě užitečné, ale jako příklad je to ono.

    #!/bin/bash i=0 zatímco [ $i -lt 22 ] dotkněte se $i i=$[$i+1] hotovo

    Tento skript vytvoří 22 souborů s názvy od 0 do 21. Smyčka poběží do sbohem proměnná hodnota $i méně ( -lt) 22.

    Nyní se pomocí smyčky zbavíme vytvořených souborů až do:

    #!/bin/bash i=0 do [ $i -eq 22 ] do rm $i i=$[$i+1] hotovo

    Zde jsme vyměnili zatímco na až do a v podmíněném výrazu nahradili "méně" (-lt) na "rovná se" (-ekv). Náš skript tedy bude fungovat tak dlouho jako hodnota $i nedosáhne 22. A místo toho dotek použili jsme rm k odstranění souborů místo jejich vytváření. Jednoduché, že?

    Na této přednášce se nadále seznamujeme bash. Rád bych vám připomněl, že tyto prvky zvažujeme bash, což nám pomůže porozumět skriptům operačního systému. Takovými prvky jsou určitě smyčky a funkce. Pokud někdo studoval programování, pak nebudou žádné potíže s pochopením těchto otázek.

    pro smyčku

    Cyklus pro PROTI bash má dva typy. Nejprve se podíváme na klasickou verzi pro. Celkový pohled je následující:

    Mezi prvky pro A v je nastavena proměnná, která zase přebírá hodnotu z posloupnosti hodnot zadaných mezi v A dělat. Mezi dělat A Hotovo existují příkazy, které se provádějí pokaždé, když proměnná změní svou hodnotu. Smyčka se zastaví, když proměnná převezme poslední hodnotu ze sekvence. Hodnoty v sekvenci jsou odděleny mezerami.

    Zde je praktický příklad:

    Posloupnost hodnot lze specifikovat různými způsoby. Explicitně - jako v příkladu výše, nebo pomocí jiných proměnných, nebo pomocí speciálních příkazů. Podívejme se na několik příkladů. Vzhledem k tomu, že hodnoty jsou zadány oddělené mezerami, může být těmito hodnotami jakákoli proměnná, která obsahuje řetězec s mezerami:

    Výsledek bude stejný jako v prvním příkladu.

    Pokud potřebujete zadat posloupnost čísel, můžete použít příkaz seq a substituční mechanismus. tým seq vrátí na obrazovku sekvenci číselných hodnot. Syntaxe je jednoduchá a bude zřejmá z níže uvedeného příkladu:

    Výsledek:

    Vraťme se k druhému typu pro. Často ve skriptech najdete tzv. C-like variantu pro, který se používá pro smyčky založené na číslech. Podívejme se na příklad:

    Smyčka běží tak dlouho, dokud je podmínka testovaná ve výrazu pravdivá. Jakmile výraz vrátí hodnotu false, provádění smyčky se zastaví.

    Praktický příklad:

    #!/bin/bash
    i=1
    zatímco [ $i -lt 7]
    dělat
    echo $i
    nechť i=i+1
    Hotovo

    V našem příkladu zkontrolujeme, že proměnná i je menší než (-lt) číslo 7 a pokud ano, pak se na obrazovce zobrazí hodnota proměnné. Výraz nechť i=i+1, zvýší proměnnou o jednu, znovu zkontroluje atd. let říká interpretovi, že argumenty by měly být rozpoznány jako číselné hodnoty. Tento řádek by se dal napsat jako nechej ++(varianta podobná c). Když se číslo zvýší o více než jednu, lze jej zapsat takto: nechť i+=2- v tomto případě i se zvýší v krocích po 2. Další možností pro zvýšení proměnné je použití vestavěné kalkulačky (pracuje pouze s celými čísly). Ke kalkulátoru lze přistupovat pomocí dvojitých závorek: i=$(($i+1)) nebo přes čtvercové: i=$[$i+1] Můžete také použít kalkulačku na příkazovém řádku:

    Musíte být opatrní se smyčkami, abyste neskončili s nekonečnou smyčkou. Mimochodem, na ladění bash skripty, na které můžete změnit první řádek #!/bin/bash -x nebo spusťte skript pomocí příkazu bash -x:

    igor@ubuntu:~/linux$ bash -x ./testfor.sh
    + i=1
    + ‚[‘ 1 -gt 5 ‚]‘
    + echo i=1
    i=1
    + nechť i=i+1
    + ‚[‘ 2 -gt 5 ‚]‘
    + echo i=2
    i=2
    + nechť i=i+1
    + ‚[‘ 3 -gt 5 ‚]‘
    + echo i=3
    i=3
    + nechť i=i+1
    + ‚[‘ 4 -gt 5 ‚]‘
    + echo i=4
    i=4
    + nechť i=i+1
    + ‚[‘ 5 -gt 5 ‚]‘
    + echo i=5
    i=5
    + nechť i=i+1
    + ‚[‘ 6 -gt 5 ‚]‘

    Nezapomeňte si procvičit psaní malých skriptů, abyste posílili své porozumění tomu, jak smyčky fungují bash.

    Funkce v bash

    Funkce se používají v bash velmi široký. Funkce jsou popsány dvěma způsoby: pomocí klíčového slova funkce a bez něj.

    První způsob:

    funkce název_funkce
    {
    funkční tělo
    }

    Druhý způsob:

    function_name()
    {
    funkční tělo
    }

    Funkce je volána jménem kdekoli ve skriptu, ale pouze po popisu funkce samotné. Funkci lze také předávat parametry, které jsou za voláním funkce (jméno) odděleny mezerou. Podívejme se na příklad skriptu bash:

    #!/bin/bash
    funkční primer
    {
    pokud [ $# -ne 0]
    pak
    místní a=1
    echo "Počet předaných parametrů - $#"
    pro mě v $@
    dělat
    echo "$a-tý parametr je $i"
    ať ++
    Hotovo
    vrátit 0
    jiný
    echo "Parametry nebyly předány"
    vrátit 1
    fi
    }
    echo „Zavolejte funkci s parametry:“
    základní nátěr a b c
    echo $?
    echo "Volání funkce bez parametrů:"
    základní nátěr
    echo $?

    V tomto příkladu funkce s názvem základní nátěr. Volání funkce s parametry: základní nátěr a b c a bez parametrů: základní nátěr. V těle funkce by vám měly být známé všechny konstrukce s výjimkou $# , $i A $@ .$# — vrací počet parametrů předaných funkci. V našem příkladu to bude číslo 3 .$@ vrátí všechny parametry na jeden řádek. V příkladu by to bylo a b c. A skrz $1 , $2 , $3 atd. Ke každému parametru můžete přistupovat samostatně. $? — obsahuje prováděcí kód posledního příkazu. V našem příkladu kód provádění funkce.

    Funkce může také vrátit číselnou hodnotu prostřednictvím klíčového slova vrátit se. Obvykle vrátí 0, pokud byla funkce provedena bez chyb, nebo nenulovou hodnotu, pokud se něco pokazilo. V příkladu, pokud je funkce volána s parametry, je vrácena hodnota 0, a pokud byla funkce volána bez parametrů, je vrácen kód 1.

    Vše o předávání parametrů funkci funguje úplně stejně pro skript. Parametry můžete také předat skriptu a manipulovat s nimi stejným způsobem pomocí $#, $@, $N. Ze stejné kategorie je možnost - $0 - která vrací název příkazu, který spustil skript. Pokud byl skript spuštěn příkazem ./script.sh, pak echo $0 vrátí hodnotu ./script.sh, a pokud na povel /home/igor/linux/script.sh, pak bude vrácena hodnota /home/igor/linux/script.sh.