Bashova teorie

/ bin / bash

0. Rejstřík

  1. Věci, které se stávají většině lidí
  2. Struktura skriptu
  3. Tisk na obrazovce
  4. Číst uživatele VSTUP
  5. Výpočty v bash
  6. Podmínky
  7. Smyčky
  8. funkce
  9. Gettops

1. Věci, které se stávají většině lidí

/ bin / bash nebo / bin / sh

Jednou z prvních věcí, které stroj při provádění našeho skriptu dělá, je sledování, s jakým shellem by to mělo dělat. Na většině současných linuxových systémů / Bin / sh je odkaz na / bin / bash, ale není tomu tak vždy, například v distribucích, které používají busybox přinášejí Sh a obvykle také přinášejí Praštit, ale pokud používáte / Bin / sh, nebude fungovat s Bash. Proto doporučuji vždy používat / bin / bash.

Unicode vs. ASCII

Přemýšleli jste někdy, proč ve svých skriptech nemůžete použít „¿“ nebo „ñ“? Nebo použít akcenty? V interaktivních skriptech to může být docela nepříjemné. Je to proto, že výchozí kódování pro Bash je ASCII, nebo co je stejné, anglická znaková sada. Abychom to mohli změnit, musíme pouze říct našemu skriptu, že chceme používat Unicode. K tomu musíte přidat řádek hned za tlumočník příkazů:

# - * - KÓDOVÁNÍ: UTF-8 - * -

Buďte opatrní, je důležité, aby tento řádek byl na začátku skriptu.

Nastavit skript jako spustitelný

Je legrační, kolik lidí spouští skripty pomocí «$ bashscript.sh" namísto "$ ./script.sh„Koneckonců, pro tohle jsme definovali shell.

Chcete-li přidat oprávnění ke spuštění, musíte provést:

sudo + x script.sh
Pokud je náš skript spustitelný, můžeme ho přidat do naší PATH a udělat jej spustitelný z libovolného místa / složky v našem počítači. K tomu musíme přidat buď do .bashrc našeho uživatele, nebo do / etc / bashrc řádku
BIN = "složka, kde máme skripty" PATH = "$ BIN $ PATH"
Pravidlem Bash je psát názvy proměnných velkými písmeny. Mnoho lidí toto pravidlo nedodržuje, ale u dlouhých skriptů se to cení, protože je činí mnohem čitelnějšími

2. Struktura skriptu

  1. Záhlaví
  2. Definice globálních proměnných
  3. pomoci
  4. funkce
  5. Hlavní tělo

Záhlaví je místo, kde označujeme, který shell chceme použít, a kódování. Výhodou funkcí je opětovné použití kódu, který se opakuje zápisem pouze jednou, a pro snazší pochopení skriptu, pro kód, který přesahuje 100 řádků, je to velmi užitečné.

Aby bylo možné používat funkce, musí být definovány s před hlavní částí našeho skriptu. A pokud chceme použít proměnné na globální úrovni celého našeho skriptu, a to jak v hlavním těle, tak ve funkcích, musíme je definovat na začátku všeho, hned za hlavičkou.

Nakonec je dobrým zvykem napsat pomocnou funkci, když náš skript běží špatně nebo se špatnými parametry. Je zřejmé, že v těchto případech chceme skript okamžitě opustit, aniž bychom museli číst funkce. K tomu můžeme použít:

function help () {echo "" "Náš dobře naformátovaný text nápovědy." "" exit if [[-z $ 1 || $ 1 == "-h" || $ 1 == "--help"]]; pak pomoz fi

Pokud do funkce nápovědy přidáme „exit“, ukončíme skript pokaždé, když spustíme nápovědu, například po chybových zprávách atd. Uložíme několik řádků kódu.

Podmínka označuje zobrazení nápovědy na obrazovce a ukončení, pokud je skript spuštěn bez parametrů nebo pokud je zadán -h / –help. Pokud se podíváte, jedná se o standardní chování většiny linuxových programů.

Použití 3 uvozovek s ozvěnou umožňuje použít zalomení řádků, aniž by se zpráva nechala zobrazit ozvěnou. U víceřádkových zpráv je mnohem pohodlnější použít echo pouze jednou.

3. Tiskněte na obrazovku

Existují 2 hlavní příkazy pro tisk na obrazovku v bash: «minout"Y"printf«. Oba jsou stejně rychlí a oba jsou součástí bash. Hlavní rozdíl pro začátečníky je v tom, že echo na konci přidá nový řádek, zatímco «printf»Ne.

Echo je v pořádku a je to to, co většina lidí používá, ale při čtení INPUT uživatele nebo pokud chcete tisknout proměnné převzaté ze souborů zpracováním textu, mohou se stát podivné věci. Obvykle jsou snadno vyřešitelné, stejně snadné jako změna dvojitých uvozovek na jednoduché nebo naopak, nebo vyřazení proměnných odkazů z uvozovek. «Echo»Dělá podivné věci také podle toho, jak byl kompilován, pokud vždy používáme Ubuntu nebo vždy Fedoru, nemá to na nás vliv, ale pokud změníme distribuci, tak to udělá.

Proto používám «printf«, Což mě nebolí a chová se více jako«printf»Z C nebo«vytisknout»V Pythonu je to velmi důležité, pokud chcete někdy přenést skript do jiného programovacího jazyka.

Pro podrobnější diskusi můžete navštívit tato otázka z Unixu a Linuxu na Stack Exchange.

4. Přečtěte si VSTUPU uživatele

Všechno, co napíšeme za názvem našeho skriptu a před stisknutím klávesy ENTER, se automaticky uloží do speciálních proměnných. Tyto proměnné jsou typu $ X, kde X je číslo.

«$0»Označuje název našeho skriptu a od«$1»Do nekonečna je vše, co jsme napsali později, variabilní. Například:

kočka << EOF >> test.sh #! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh můj soubor.txt

Vytvoříme testovací skript, uděláme jej spustitelný a spustíme ho se 2 parametry. Získáváme výstup obrazovky:

$ 0 = ./script.sh $ 1 = moje $ 2 = file.txt

Pomocí uvozovek jsme mohli předat „můj soubor.txt“ do „$ 1“.

Můžeme také číst INPUT uživatele pomocí příkazu „read“, který přímo označuje proměnnou, kam chceme parametr uložit. Například:

printf "Jaké je vaše jméno? \ n" přečíst JMÉNO printf "Dobrý den, $ NAME. \ n"
Při přiřazování proměnných buďte opatrní. „$ VAR = content“ způsobí chybu, mezery mezi znaménkem rovnosti, názvem proměnné a obsahem nemohou být ponechány. Správné použití je „VAR = obsah“

5. Výpočty v Bash

K tomu můžeme použít «expr"Dokud nebudeme muset dělat složité výpočty." Je třeba poznamenat dvě věci, první je, že «expr»Připouští pouze celá čísla, druhým je, že dělení vrací celý výsledek, abychom viděli zbytek, který můžeme použít«%".

Obvykle chceme přiřadit výsledek expr proměnné. Můžeme to udělat dvěma způsoby:

VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)

Můžete také přeskočit «expr»Použití dvojitých závorek:

VAR2 = $ (($ VAR1 / 100))
Pro další vysvětlení «expr»Nebo alternativu, která používá celá čísla, si můžete prohlédnout tento záznam KZKG ^ gaara.

6 Podmínky

Již bylo napsáno velmi obsáhlým způsobem o «if","jiný","Elif»A podmínky. O tom si můžete přečíst v:

Chci jen zdůraznit rozdíl mezi používáním jednoduchých hranatých závorek, «[]«, A dvojité závorky,«[[]]«, Za podmínek. U dvojitých závorek můžeme použít další podmínky:

  • «&&»Pro a
  • «||»Pro nebo

Použít "&&"Y"||»U jednoduchých hranatých závorek by měla být každá část oddělena v samostatných hranatých závorkách. Příklad použitý pro část skriptu, která sleduje, zda je třeba spustit pomoc, by byl:

pokud [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--help"]]; pak pomoz fi

Také nám to ušetří nutnost psát názvy proměnných do uvozovek, abychom zabránili chybám. Například:

pokud [$ 1 = 1]; then printf "Parametr je roven 1."; fi if ["$ 1" = 1]; then printf "Parametr je roven 1."; fi if [[$ 1 = 1]]; then printf "Parametr je roven 1."; fi

Pokud je soubor script.sh spuštěn bez jakýchkoli parametrů, první případ by způsobil chybu:

bash: [: =: očekává se unární operátor
V jazyce Bash jsou slova „=“ a „==“ interpretována stejným způsobem. To se neděje v jiných programovacích jazycích, kde se „=“ používá pouze k přiřazování proměnných.

O čem se ještě nemluvilo, je «případ«, Používá se ke zjednodušení«if«. Začněme na začátku, když nemáme žádné «if»Celý kód bude spuštěn. Pokud přidáme podmínku «if»Budeme mít dva případy, jeden, ve kterém blok kódu uvnitř«if»A další případ, kdy se tento blok neprovede.

Pokud přidáme «jiný«Budeme mít také dva případy, ale tyto dva případy se liší od těch předchozích. Protože nyní budou dva bloky podmíněného kódu, A a B, a blok C, což je zbytek programu. A nebo B budou provedeny a C. V předchozím případě to byly A a C nebo pouze C.

Vyhnout se podmínkám psaní «pokud / jinak" v rámci "jiný»A pro zjednodušení čtení kódu byl vytvořen«Elif«. Když máme mnoho podmínek, které závisí na předchozím, například rozsah čísel nebo typ:

VAR1 = 1 $, pokud [[$ VAR1 = 1]]; potom printf "1 \ n" elif [[$ VAR1 = 2]]; potom printf "2 \ n" elif [[$ VAR1 = 3]]; potom printf "3 \ n" else printf "žádný \ n" fi

V případě posledního «Elif»Bude přečteno mnoho podmínek. V případě, že je tento proces efektivní:

VAR1 = $ 1 případ $ VAR v 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 nebo 4, záleží \ n" ;; *) printf "none \ n" ;; že C.

Přečte se proměnná, v tomto případě VAR1, a uvidí se, zda je ekvivalentní s některým z případů, pokud ne, provede se výchozí případ „*“. Dvojité středníky jsou ekvivalentní «rozbít", Oni říkají"případ»To musí skončit.

«Ukázkové»Lze použít také jako posloupnost«if«, K tomu musíte použít« ;; & »(pokračovat) místo« ;; » (stop).

7. Smyčky

V jakémkoli programovacím jazyce je známo velmi málo smyček. V Bash jsou «zatímco","až do"Y"for«. O tom již bylo v blogu napsáno:

Existují dva typy smyček «for«, Ty, které jsou typu«$ za VAR v LOQUESEA»A co jsou typu C«$ pro ((I = 0; I <= 10; I ++))«. Druhý typ smyček «for»Jsou velmi užitečné, má 3 části na začátku smyčky:

  • Deklarace a inicializace proměnných (v tomto případě pomocná proměnná „I = 0“).
  • Podmínka provedení (dokud I není menší nebo roven 10).
  • Zvýšení pomocné proměnné

Podle mého názoru je to nejmocnější smyčka ze všech. Příklad, který vytiskne všechna čísla od 0 do 10, včetně:

#! / bin / bash for ((I = 0; I <= 10; I ++)); do printf "$ I \ n" hotovo

8. Funkce

Existuje několik věcí, které nám Bash neumožňuje, že? Na první pohled vám funkce bash brání ve 3 věcech: deklarování lokálních proměnných ve funkcích, předávání parametrů funkcím a vrácení parametrů. Všechno má řešení.

Nedělejte nic jako:

#! / bin / bash VAR = 1 printc "$ VAR \ n" funkce ahoj () {VAR = 2 printf "$ VAR \ n"} ahoj printf "$ VAR \ n"

Vytiskne se na obrazovku 1, 2 a 2.

Chcete-li deklarovat místní proměnné, přidejte «místní»Při deklaraci:

#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funkce foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"

Vytiskne 1, 1, 2, 1 na obrazovce.

Jak předáváte parametry funkci?

#! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - funkce ahoj () {printf "Hello $ 1 \ n"}

printf "Jak se jmenujete? \ n"
číst VAR1
ahoj $ VAR1

Jak jsou vráceny parametry?

#! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - funkce hello () {printf "Hello holita"} printf "Jak se jmenujete? \ n" číst VAR1 VAR1 = $ (ahoj) # ZDE printf "$ VAR1 $ VAR2 \ n"

Jak vidíte, má to dvě nevýhody, můžete vrátit pouze jeden parametr, kterým může být vektor 😀, a pokud chcete vrátit parametr, z této funkce již nelze tisknout na obrazovku.

Více informací o funkcích najdete na [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]tento článek z Usemoslinux[/url].

9. Getops

Jedna z posledních věcí, které potřebujete o Bashovi vědět, abyste mohli vytvářet složité skripty, je «getops«. Používá se k předání voleb do skriptu bez ohledu na pořadí. Jedinou nevýhodou je, že ovlivňuje pouze krátké možnosti:

#! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - VARC = 0 funkce help () {printf "Zpráva nápovědy \ n" exit} pokud [[-z $ 1]]; pak pomozte fi zatímco getopts: ha: b: c OPT; udělejte případ $ OPT v h) help ;; :) Pomoc ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Pomoc ;; esac done # Hlavní blok skriptu, který # dělá věci s VARA, VARB a VARC

«Gettopts»Postupně čte možnosti, takže je potřeba smyčka.

Existují 2 typy možností, které lze předat pomocí «getopts„:

  • Parametry zvané příznaky, v tomto případě -c nebo -h. Jsou specifikovány písmenem, které chceme použít. Jsou jako booleovské proměnné, «pravdivý»(Are) nebo«nepravdivý„(Nejsou tady).
  • Parametry s přidruženými argumenty, -a cokoli, -b cokoli. Jsou specifikovány písmenem, které chceme, s dvojtečkou níže. Argument je uložen v OPTARG (tento název je neměnný).
Počáteční dvojité body mají ukázat žádné chyby.

Co dělá tento skript?

Zobrazí zprávu nápovědy, když není předána žádná možnost, když je předán parametr "-h", když je předán neplatný parametr (například "-x", toto je provedeno "\?") Nebo když platný parametr bez argumentu (":"). V ostatních případech uloží přítomnost "-c" jako 1 ve VARC a hodnoty předané s "-a" a "-b" ve VARA a VARB.


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   živý řekl

    HLAVNĚ. Neříkám více U_U

  2.   Miguel řekl

    Dobrý den, velmi dobrý článek.
    Ahoj, dal jsi oprávnění sudo + x místo chmod + x

    1.    Henry řekl

      $ sudo chmod + x script.sh
      (Přesněji řečeno, hehe)

      Ah, gratuluji a děkuji!

  3.   ohnivý chlad řekl

    Velmi dobrý příspěvek, opravdu vám blahopřeji, držte to, pozdravy

  4.   Gustavo řekl

    A pokud chcete, aby byl skript při spuštění viditelný, krok za krokem, abyste viděli například to, jak se chovají proměnné, podmínky a vše, můžete použít:

    sh -x skript

    pozdravy

  5.   přivandrovalec řekl

    Kus výchovy. Vynikající a velmi dobře vysvětleno.
    Děkuju.

  6.   Gabriel řekl

    Vynikající příspěvek na toto téma 😉

  7.   Mario Guillermo Zavala Silva řekl

    Velmi zajímavé a velmi důležité díky za informace….
    Na zdraví !!!

  8.   Ne z Brooklynu řekl

    Děkuji vám všem za blahopřání, protože pokud jde o příkaz Miguel, nedovolí mi po zveřejnění upravit záznam. Bude to muset udělat elav, jak si představuji.

  9.   Adrian řekl

    Velmi dobře!

    Nejprve jsem vám chtěl poblahopřát k příspěvku, zjistil jsem, že je snadno pochopitelný a opravdu pomáhá dodržovat pokyny, abyste programovali dobře v bash, zejména pro lidi, kteří začínají programovat.

    Našel jsem však několik podrobností, které by podle mě měly být opraveny.

    Za prvé: v sekci «2. STRUKTURA SKRIPTU »funkce není uzavřena, což způsobí problémy při jejím provádění ve skriptu.
    Řešením by bylo přidat složenou závorku hned za příkazem „exit“.

    Zadruhé: v sekci «4. PŘEČTĚTE SI VSTUP UŽIVATELE “potvrzujete, že parametry, které může uživatel zadat, se pohybují v rozmezí od 0 do nekonečna, nicméně výraz„ bash “bude interpretovat pouze od 0 do 9 $, protože 10 $ by se rovnalo $ 1 + 0.
    Chcete-li tento problém vyřešit, můžete pomocí příkazu „shift“ uchopit následující proměnné. Nebo zadejte proměnnou ve složených závorkách „$ {10}“, aby bash převzal hodnoty společně, nikoli jako $ 1 + 0.

    Bez dalších okolků, pozdravy!

    1.    Ne z Brooklynu řekl

      Děkuji za Váš komentář. Úplně se nepodařilo vysvětlit správné použití ukončení, a to jak ve skriptu, tak ve funkcích. Pokud jde o $ {10}, nikdy jsem tolik neodkázal, takže jsem se s tímto problémem nesetkal, je dobré vědět, že pro to existuje řešení (už jsem přeškrtl novou věc, kterou jsem se dnes naučil)

  10.   chanio řekl

    Moc děkuji za článek! Některé věci, které zmiňujete, stále chyběly objasnění. Například getops.
    V části výstupů na obrazovce jste nezmínili kočku, kterou jste později zmínili ...
    kočka <
    ***************************************
    * TATO FORMA JE VELMI VÝSLOVNÁ *
    ***************************************
    EOF

    Ve vašem příkladu:
    kočka << EOF >> test.sh
    Je třeba zmínit dvě věci ... >> je to „append“, to znamená, že pokud zopakujete stejný příkaz, budete mít celý skript duplicitně ... Měli byste použít pouze jeden ...
    kočka << EOF> script.sh
    Ano, měl by se také jmenovat script.sh
    Pak dovnitř
    pokud [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoc"]]; pak
    pomoc
    fi

    Myslím, že by to mělo být napsáno ...
    pokud [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoc"]]; pak
    ...

    Od společnosti BASH je toho možné objevit mnohem více.
    Mohli byste to pojmenovat „ZÁKLADY“? 🙂
    Například parametr 'testery' jako -z, aby zjistil, zda jsou prázdné, nebo -f, aby zjistil, zda existuje jako soubor.

    Ještě jednou děkujeme za vaši snahu.
    Alberto

  11.   clow_eriol řekl

    Velmi dobrý výukový program pro bash skripty!

  12.   Ocz řekl

    -- KÓDOVÁNÍ: UTF-8 --

    Je to poprvé, co jsem viděl tento řádek nastavit kódování znaků v bash skriptu. Zdá se to typičtější pro Python než Bash. Je to opravdu nutné? Hledal jsem odkaz na Google, ale nemohu nic najít, máte po ruce odkaz, který hovoří o této záležitosti? Konkrétně o vhodnosti této linky.

    Podle mého názoru pro psaní skriptů v Bash pomocí UTF-8 stačí uložit textový soubor jako takový (bez BOM) a mít správně nastaveny určité proměnné prostředí (LANG a LC_ *).
    Potom je samozřejmě nutné, aby byly prováděné příkazy připraveny pro jiná kódování než ASCII. Například pokud chceme přejít na velká písmena, nezdá se, že by to fungovalo:
    «Echo áéíóú | tr az AZ »
    o:
    «Echo áéíóú | tr [: dolní:] [: horní:] »
    a je lepší použít:
    «Echo áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Ne z Brooklynu řekl

      O "kódování»V tomto blogu bylo zmíněno dříve:

      Bash: jak vytvořit spustitelný skript
      Skript obslužného programu po instalaci

    2.    borriquito jako ty řekl

      Někdo mě opraví, ale ten kódovací řádek (# -- KÓDOVÁNÍ: UTF-8 --) Nemá to nic společného s bash nebo shellem: je to řádek komentáře (začíná na #) a slouží k tomu, aby řekl EDITOR, že používáme k psaní skriptu (vim, emacs ...) kódování souboru.

      Ve skutečnosti bash takový řádek nevidí, protože je to řádek komentáře.

  13.   JoRgE-1987 řekl

    Skvělý výukový program, protože Sysadmin zná skriptování v Bashi, je nezbytný, je užitečný pro všechno.

    Velmi velmi dobrý!

    Zdravím!

  14.   Edward Cuomo řekl

    V případě, že je to komukoli užitečné, je zde několik způsobů použití a příkladů pro vytvoření vlastních skriptů: https://github.com/reduardo7/hsabx

  15.   Black Lito řekl

    Velmi dobře. Nové věci k přidání do mých skriptů. Kódovací věc a věc printf ji neměli.
    Děkuji!!!

  16.   xxxtonixxx řekl

    Tak dobrý článek! Tuto si nechávám pro oblíbené, bylo by hezké opravit, co je špatně, a dokonce ji rozšířit o další obsah. Potlesk za všechny tyto informace !!!!