Bash skripty: Začínáme

Bash skripty: Začínáme
Bash Scripts Část 2: Smyčky
Bash skripty, část 3: možnosti a přepínače příkazového řádku
Bash skripty, část 4: vstup a výstup
Bash skripty, část 5: signály, úlohy na pozadí, správa skriptů
Bash Scripts, Část 6: Funkce a vývoj knihoven
Bash skripty, část 7: sed a zpracování textu
Bash Scripts, část 8: The awk Data Processing Language
Bash skripty, část 9: Regulární výrazy
Bash Scripts Část 10: Praktické příklady
Bash skripty, část 11: očekávání a automatizace interaktivních nástrojů

Dnes budeme mluvit o bash skriptech. Tento - skripty příkazového řádku, napsaný pro bash shell. Existují další shelly, jako je zsh, tcsh, ksh, ale my se zaměříme na bash. Tento materiál je určen pro každého, jedinou podmínkou je schopnost pracovat příkazový řádek Linux.

Bash skripty: Začínáme

Skripty příkazového řádku jsou sady stejných příkazů, které lze zadávat z klávesnice, shromážděné v souborech a sjednocené k nějakému společnému účelu. Výsledky práce týmů přitom mohou mít buď nezávislou hodnotu, nebo sloužit jako vstup pro ostatní týmy. Skripty představují účinný způsob automatizace často prováděných akcí.

Bash skripty: Začínáme

Pokud tedy mluvíme o příkazovém řádku, umožňuje vám provádět několik příkazů najednou a zadávat je středníkem:

pwd ; whoami

Ve skutečnosti, pokud jste to zkusili ve svém terminálu, váš první bash skript, který používá dva příkazy, již byl napsán. Funguje to takto. Nejprve tým pwd zobrazí informace o aktuálním pracovním adresáři a poté příkaz whoamizobrazuje informace o uživateli, pod kterým jste přihlášeni.

Pomocí tohoto přístupu můžete na jednom řádku kombinovat tolik příkazů, kolik chcete, limitem je pouze maximální počet argumentů, které lze programu předat. Tento limit můžete definovat pomocí následujícího příkazu:

getconf ARG_MAX

Příkazový řádek je skvělý nástroj, ale musíte do něj zadávat příkazy pokaždé, když je potřebujete. Co když napíšeme sadu příkazů do souboru a jednoduše zavoláme tento soubor, aby je provedl? Ve skutečnosti se soubor, o kterém mluvíme, nazývá skript příkazového řádku.

Jak fungují bash skripty

Vytvořte prázdný soubor pomocí příkazu touch. V jeho prvním řádku musíte specifikovat, který shell budeme používat. Máme zájem o bash, takže první řádek souboru bude:

#!/bin/bash

Jinde v tomto souboru se symbol hash používá k označení komentářů, které shell nezpracovává. První řádek je však speciální případ, jedná se o znak libry následovaný vykřičníkem (tato sekvence se nazývá Shebang) a cestu k němu bash, označte systém, pro který byl skript vytvořen speciálně bash.

Příkazy shellu jsou odděleny odřádkováním, komentáře jsou odděleny znakem libry. Vypadá to takto:

#!/bin/bash
# This is a comment
pwd
whoami

Zde, stejně jako v příkazovém řádku, můžete psát příkazy na jeden řádek a oddělovat je středníkem. Pokud však píšete příkazy na různé řádky, je soubor snáze čitelný. V každém případě je skořápka zpracuje.

Nastavení oprávnění pro soubor skriptu

Uložte soubor zadáním názvu myscripta bash skript je téměř hotový. Nyní zbývá pouze učinit tento soubor spustitelným, jinak při pokusu o jeho spuštění dojde k chybě Permission denied.

Bash skripty: Začínáme
Pokus o spuštění souboru skriptu s nesprávně nakonfigurovanými oprávněními

Udělejme soubor spustitelným:

chmod +x ./myscript

Nyní to zkusíme provést:

./myscript

Po nastavení oprávnění vše funguje jak má.

Bash skripty: Začínáme
Úspěšně spusťte bash skript

Výstup zprávy

Chcete-li vytisknout text na konzole Linuxu, použijte příkaz echo. Využijme znalosti této skutečnosti a upravme náš skript a doplňte vysvětlení k datům, která vypisují příkazy, které již v něm jsou:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

Zde je to, co se stane po spuštění aktualizovaného skriptu.

Bash skripty: Začínáme
Výstup zpráv ze skriptu

Nyní můžeme pomocí příkazu zobrazit vysvětlující popisky echo. Pokud nevíte, jak upravit soubor pomocí nástrojů Linuxu, nebo pokud jste příkaz ještě neviděli echo, Podívejte se na tento materiál.

Použití proměnných

Proměnné umožňují ukládat informace do souboru skriptu, jako jsou výsledky příkazů, pro použití jinými příkazy.

Na provádění jednotlivých příkazů bez uložení výsledků jejich práce není nic špatného, ​​ale možnosti tohoto přístupu jsou velmi omezené.

Existují dva typy proměnných, které lze použít v bash skriptech:

  • Proměnné prostředí
  • Uživatelské proměnné

Proměnné prostředí

Někdy příkazy shellu potřebují pracovat s některými systémovými daty. Zde je například návod, jak zobrazit domovský adresář aktuálního uživatele:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Upozorňujeme, že můžeme použít systémovou proměnnou $HOME ve dvojitých uvozovkách to systému nezabrání v jeho rozpoznání. Zde je to, co se stane, když spustíte výše uvedený skript.

Bash skripty: Začínáme
Použití proměnné prostředí ve skriptu

Ale co když chcete zobrazit znak dolaru? Zkusme toto:

echo "I have $1 in my pocket"

Systém detekuje znak dolaru v řetězci odděleném uvozovkami a předpokládá, že jsme odkazovali na proměnnou. Skript se pokusí zobrazit hodnotu nedefinované proměnné. $1. To není to, co potřebujeme. Co dělat?

V takové situaci pomůže použití řídicího znaku zpětného lomítka před znakem dolaru:

echo "I have $1 in my pocket"

Skript nyní vydá přesně to, co se očekává.

Bash skripty: Začínáme
Použití únikové sekvence k výstupu znaku dolaru

Uživatelské proměnné

Kromě proměnných prostředí vám bash skripty umožňují nastavit a používat vlastní proměnné ve skriptu. Takové proměnné mají hodnotu, dokud skript neskončí.

Stejně jako u systémových proměnných lze k uživatelským proměnným přistupovat pomocí znaku dolaru:
TNW-CUS-FMP - promo kód na 10% slevu na naše služby, k dispozici pro aktivaci do 7 dnů

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

Zde je to, co se stane po spuštění takového skriptu.

Bash skripty: Začínáme
Vlastní proměnné ve skriptu

Náhrada příkazů

Jednou z nejužitečnějších funkcí bash skriptů je schopnost extrahovat informace z výstupu příkazů a přiřadit je k proměnným, což umožňuje použít tyto informace kdekoli v souboru skriptu.

To lze provést dvěma způsoby.

  • Se zadním znakem "`"
  • S pomocí konstrukce $()

Při použití prvního přístupu buďte opatrní, abyste místo zpětného zaškrtnutí nepoužili jedinou uvozovku. Příkaz musí být uzavřen ve dvou takových ikonách:

mydir=`pwd`

Ve druhém přístupu je totéž napsáno takto:

mydir=$(pwd)

A scénář by nakonec mohl vypadat takto:

#!/bin/bash
mydir=$(pwd)
echo $mydir

Během jeho činnosti je výstup příkazu pwdbudou uloženy v proměnné mydir, jehož obsah pomocí příkazu echo, přejde do konzole.

Bash skripty: Začínáme
Skript, který ukládá výsledky příkazu do proměnné

Matematické operace

Chcete-li provádět matematické operace v souboru skriptu, můžete použít konstrukci formuláře $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Bash skripty: Začínáme
Matematické operace ve skriptu

řídící struktura if-then

V některých scénářích je nutné řídit tok provádění příkazů. Pokud je například určitá hodnota větší než pět, musí být provedena jedna akce, jinak druhá. To je použitelné v mnoha situacích a zde nám pomůže struktura ovládání if-then. Ve své nejjednodušší podobě to vypadá takto:

if команда
then
команды
fi

A zde je pracovní příklad:

#!/bin/bash
if pwd
then
echo "It works"
fi

V tomto případě, pokud provedení příkazu pwddokončí úspěšně, v konzole se zobrazí text „to funguje“.

Využijme znalostí, které máme, a napišme si složitější scénář. Řekněme, že potřebujeme najít uživatele /etc/passwda pokud byl nalezen, nahlaste, že existuje.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

To se stane po spuštění tohoto skriptu.

Bash skripty: Začínáme
Uživatelské vyhledávání

Zde jsme použili příkaz grepk vyhledání uživatele v souboru /etc/passwd. Pokud tým grepneznáte, jeho popis najdete zde.

V tomto příkladu, pokud je uživatel nalezen, skript zobrazí příslušnou zprávu. Co když se uživatel nepodaří najít? V tomto případě skript jednoduše dokončí provádění, aniž by nám cokoliv řekl. Rád bych, aby nám o tom také řekl, pojďme tedy kód vylepšit.

Kontrolní konstrukce if-then-else

Aby program mohl hlásit jak výsledky úspěšného hledání, tak neúspěchu, využíváme konstrukci if-then-else. Zde je návod, jak se to nastavuje:

if команда
then
команды
else
команды
fi

Pokud první příkaz vrátí nulu, což znamená, že byl úspěšně proveden, podmínka bude pravdivá a provedení nebude pokračovat ve větvi else. V opačném případě, pokud se vrátí něco jiného než nula, což znamená selhání nebo chybný výsledek, příkazy za else.

Pojďme napsat následující skript:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Jeho poprava šla dolů else.

Bash skripty: Začínáme
Spuštění skriptu s konstrukcí if-then-else

No, pojďme dál a zeptejme se sami sebe na obtížnější podmínky. Co když potřebujete zkontrolovat ne jednu podmínku, ale několik? Pokud je například nalezen požadovaný uživatel, měla by se zobrazit jedna zpráva, pokud je splněna nějaká další podmínka, měla by se zobrazit další zpráva a tak dále. V takové situaci nám pomohou vnořené podmínky. Vypadá to takto:

if команда1
then
команды
elif команда2
then
команды
fi

Pokud první příkaz vrátí nulu, což znamená jeho úspěšné provedení, budou provedeny příkazy v prvním bloku then, v opačném případě, pokud je první podmínka nepravdivá a pokud druhý příkaz vrátí nulu, bude proveden druhý blok kódu.

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

V takovém skriptu můžete například pomocí příkazu vytvořit nového uživatele useradd, pokud vyhledávání nevrátilo žádné výsledky, nebo udělejte něco jiného užitečného.

Porovnání čísel

Ve skriptech můžete porovnávat číselné hodnoty. Níže je uveden seznam příslušných příkazů.

n1 -eq n2Vrátí hodnotu true if n1 rovná se n2.
n1 -ge n2 Vrátí hodnotu true if n1více nebo stejné n2.
n1 -gt n2Vrátí hodnotu true if n1 více n2.
n1 -le n2Vrátí hodnotu true if n1menší nebo stejný n2.
n1 -lt n2Vrátí hodnotu true, pokud je n1 menší než n2.
n1 -ne n2Vrátí hodnotu true if n1není si rovna n2.

Jako příklad zkusme jeden ze srovnávacích operátorů. Všimněte si, že výraz je uzavřen v hranatých závorkách.

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

Zde je výstup tohoto příkazu.

Bash skripty: Začínáme
Porovnávání čísel ve skriptech

Proměnná hodnota val1větší než 5, nakonec se větev provede thenoperátor porovnání a na konzole se zobrazí odpovídající zpráva.

Porovnání řetězců

Skripty mohou také porovnávat hodnoty řetězců. Porovnávací operátory vypadají docela jednoduše, ale operátory porovnávání řetězců mají určité zvláštnosti, kterých se dotkneme níže. Zde je seznam operátorů.

str1 = str2 Testuje řetězce na rovnost, vrátí hodnotu true, pokud jsou řetězce totožné.
str1 != str2Vrátí hodnotu true, pokud řetězce nejsou totožné.
str1 < str2Vrátí hodnotu true if str1méně než str2.
str1 > str2 Vrátí hodnotu true if str1více než str2.
-n str1 Vrátí hodnotu true if length str1Nad nulou.
-z str1Vrátí hodnotu true if length str1je nula.

Zde je příklad porovnání řetězců ve skriptu:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

V důsledku provedení skriptu dostaneme následující.

Bash skripty: Začínáme
Porovnání řetězců ve skriptech

Zde je jedna vlastnost porovnávání řetězců, která stojí za zmínku. Konkrétně musí být operátory ">" a "<" escapovány zpětným lomítkem, jinak skript nebude fungovat správně, i když se nezobrazí žádné chybové zprávy. Skript interpretuje znak ">" jako příkaz k přesměrování výstupu.

Takto vypadá práce s těmito operátory v kódu:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Zde jsou výsledky skriptu.

Bash skripty: Začínáme
Porovnání řetězců, varování

Všimněte si, že skript, i když je spuštěn, dává varování:

./myscript: line 5: [: too many arguments

Abychom se tohoto varování zbavili, uzavíráme $val2 ve dvojitých uvozovkách:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Nyní vše funguje jak má.

Bash skripty: Začínáme
Porovnání řetězců

Další vlastností operátorů ">" a "<" je způsob, jakým pracují s velkými a malými písmeny. Abychom této funkci porozuměli, připravme si textový soubor s následujícím obsahem:

Likegeeks
likegeeks

Uložte jej pod názvem myfilea poté spusťte v terminálu následující příkaz:

sort myfile

Seřadí řádky ze souboru takto:

likegeeks
Likegeeks

Tým sort, ve výchozím nastavení seřadí řetězce vzestupně, což znamená, že malé písmeno v našem příkladu je menší než velké písmeno. Nyní si připravíme skript, který bude porovnávat stejné řetězce:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Pokud jej spustíte, ukáže se, že opak je pravdou – malé písmeno je nyní větší než velké.

Bash skripty: Začínáme
příkaz sort a porovnání řetězců v souboru skriptu

V porovnávacích příkazech jsou velká písmena menší než malá písmena. Porovnání řetězců se zde provádí porovnáním kódů znaků ASCII, pořadí řazení je tedy závislé na kódech znaků.

Tým sort, zase používá pořadí řazení určené v nastavení jazyka systému.

Kontroly souborů

Možná, že níže uvedené příkazy se nejčastěji používají v bash skriptech. Umožňují vám zkontrolovat různé podmínky týkající se souborů. Zde je seznam těchto příkazů.

-d fileZkontroluje, zda soubor existuje a zda se jedná o adresář.
-e fileZkontroluje, zda soubor existuje.
-f file Zkontroluje, zda soubor existuje a zda se jedná o soubor.
-r fileZkontroluje, zda soubor existuje a je čitelný.
-s file ПZkontroluje, zda soubor existuje a není prázdný.
-w fileZkontroluje, zda soubor existuje a je možné do něj zapisovat.
-x fileZkontroluje, zda soubor existuje a je spustitelný.
file1 -nt file2 Kontroluje, zda je novější file1Než file2.
file1 -ot file2Kontroluje, zda je starší file1Než file2.
-O file Zkontroluje, zda soubor existuje a je vlastněn aktuálním uživatelem.
-G fileZkontroluje, zda soubor existuje a zda se jeho ID skupiny shoduje s ID skupiny aktuálního uživatele.

Tyto příkazy, stejně jako mnoho dalších dnes diskutovaných, jsou snadno zapamatovatelné. Jejich jména, která jsou zkratkami pro různá slova, přímo označují kontroly, které provádějí.

Vyzkoušíme si jeden z příkazů v praxi:

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

Tento skript pro existující adresář zobrazí jeho obsah.

Bash skripty: Začínáme
Výpis obsahu adresáře

Věříme, že se zbytkem příkazů můžete experimentovat sami, všechny platí podle stejného principu.

Výsledky

Dnes jsme mluvili o tom, jak začít psát bash skripty, a probrali jsme některé základní věci. Ve skutečnosti je téma programování bash obrovské. Tento článek je překladem prvního dílu velké série 11 materiálů. Pokud chcete pokračovat právě teď, zde je seznam originálů těchto materiálů. Pro usnadnění je zde uveden ten, jehož překlad jste právě četli.

  1. Bash skript krok za krokem - zde se bavíme o tom, jak začít s tvorbou bash skriptů, uvažuje se o použití proměnných, jsou popsány podmíněné konstrukce, výpočty, porovnávání čísel, řetězců, zjišťování informací o souborech.
  2. Bash Scripting část 2, Bash úžasné - zde jsou odhaleny funkce práce se smyčkami for a while.
  3. Bash Scripting Část 3, Parametry a možnosti - tento materiál je věnován parametrům příkazové řádky a klíčům, které lze předávat skriptům, práci s daty, která uživatel zadává a která lze číst ze souborů.
  4. Bash Scripting Část 4, Vstup a výstup - zde mluvíme o deskriptorech souborů a práci s nimi, o vstupu, výstupu, chybách, výstupních přesměrovacích streamech.
  5. Bash Scripting část 5, Sighals & Jobs — tento materiál je věnován signálům Linuxu, jejich zpracování ve skriptech, plánovanému spouštění skriptů.
  6. Bash skriptování, část 6, Funkce - zde se dozvíte o vytváření a používání funkcí ve skriptech, o vývoji knihoven.
  7. Bash Scripting Část 7, Použití sed — tento článek je o práci s textovým editorem sed stream.
  8. Bash Scripting Část 8, Použití awk — tento materiál je věnován programování v jazyce zpracování dat awk.
  9. Bash skriptování, část 9, Regulární výrazy - zde si můžete přečíst o použití regulárních výrazů v bash skriptech.
  10. Bash Scripting část 10, praktické příklady - zde jsou uvedeny metody pro práci se zprávami, které lze odesílat uživatelům, a také způsob monitorování disku.
  11. Bash skriptování, část 11, Expect Command - tento materiál je věnován nástroji Expect, pomocí kterého můžete automatizovat interakci s interaktivními nástroji. Zejména se jedná o očekávané skripty a jejich interakci s bash skripty a dalšími programy.

Myslíme si, že jednou ze skvělých věcí na této sérii článků je to, že začíná od toho nejzákladnějšího, vhodného pro uživatele jakékoli úrovně, postupně vede k docela vážným tématům a dává každému šanci pokročit ve skriptování příkazového řádku Linuxu.

Vážení čtenáři! Žádáme guru programování bash, aby promluvili o tom, jak se dostali k výšinám mistrovství, sdíleli tajemství a čekáme na dojmy od těch, kteří právě napsali svůj první scénář.

Bash skripty: Začínáme

Průzkumu se mohou zúčastnit pouze registrovaní uživatelé. Přihlásit se, prosím.

Přeložit zbytek série článků?

  • Ano!

  • Ne, není potřeba

Hlasovalo 1030 uživatelů. 106 uživatelů se zdrželo hlasování.

Zdroj: www.habr.com

Přidat komentář