Dnes se budeme bavit o bash skriptech. Toto jsou , napsané pro shell bash. Existují i další shelly, například — zsh, tcsh, ksh, ale zaměříme se na bash. Tento materiál je určen všem zájemcům, jedinou podmínkou je umění pracovat v Linuxu.
Příkazy příkazového řádku jsou soubory stejných příkazů, které můžete zadávat z klávesnice, shromážděné do souborů a spojeny nějakým společným cílem. Přitom výsledky práce příkazů mohou představovat buď samostatnou hodnotu, nebo sloužit jako vstup pro jiné příkazy. Skripty jsou mocným způsobem automatizace často prováděných úkonů.
Takže, pokud mluvíme o příkazovém řádku, umožňuje vám provést několik příkazů najednou, pokud je zadáte přes středník:
pwd ; whoami Ve skutečnosti, pokud jste to vyzkoušeli ve svém terminálu, váš první bash skript, ve kterém jsou použity dva příkazy, je již napsán. Funguje to takto. Nejprve příkaz pwd vypisuje informace o aktuálním pracovním adresáři, pak příkaz whoamiukazuje údaje o uživateli, pod kterým jste přihlášeni do systému.
Použitím podobného přístupu můžete kombinovat libovolný počet příkazů v jednom řádku, omezení je pouze v maximálním počtu argumentů, které lze programu předat. Toto omezení lze určit pomocí příkazu:
getconf ARG_MAXPříkazový řádek je skvělý nástroj, ale příkazy do něj musíte zadávat pokaždé, když je potřebujete. Co kdybyste zapsali sadu příkazů do souboru a jednoduše tento soubor vyvolali k jejich provedení? Vlastně, ten soubor, o kterém mluvíme, se nazývá příkazový skript.
Jak fungují bash skripty
Vytvořte prázdný soubor pomocí příkazu touch. V první řádce musíme uvést, jaký konkrétní shell použijeme. Zajímá nás bash, proto první řádka souboru bude následující:
#!/bin/bash V dalších řádcích tohoto souboru se symbol mřížky používá k označení komentářů, které shell neinterpretuje. Avšak první řádka je zvláštní případ, zde mřížka, za kterou následuje vykřičník (tato posloupnost se nazývá ) a cesta k bash, označuje systému, že skript byl vytvořen právě pro bash.
Příkazy shellu jsou odděleny znakem nového řádku, komentáře jsou zvýrazněny znakem mřížky. Takto to vypadá:
#!/bin/bash
# This is a comment
pwd
whoamiTady, stejně jako v příkazovém řádku, lze zapisovat příkazy v jednom řádku, oddělené středníkem. Nicméně, pokud píšete příkazy na různých řádcích, soubor se lépe čte. V každém případě jej shell zpracuje.
Nastavení oprávnění pro soubor skriptu
Uložte soubor s názvem myscript, a práce na vytvoření bash skriptu je téměř u konce. Nyní zbývá pouze udělat tento soubor spustitelným, jinak se při pokusu o jeho spuštění setkáte s chybou Permission denied.

Pokusu o spuštění souboru skriptu s nesprávně nastavenými oprávněními
Udělejme soubor spustitelným:
chmod +x ./myscriptNyní se pokusíme jej spustit:
./myscriptPo nastavení oprávnění vše funguje jak má.

Úspěšné spuštění bash skriptu
Výstup zpráv
Pro výstup textu do konzole Linuxu se používá příkaz echo. Využijeme tuto znalost a upravíme náš skript, přidáme vysvětlení k datům, která již obsahují existující příkazy:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiTakto to vypadá po spuštění aktualizovaného skriptu.

Výstup zpráv ze skriptu
Nyní můžeme vypisovat komentáře pomocí příkazu echo. Pokud nevíte, jak upravit soubor pomocí nástrojů Linuxu, nebo jste se s příkazem echodříve nesetkali, podívejte se na materiál.
Použití proměnných
Proměnné umožňují ukládat do skriptu informace, například – výsledky práce příkazů, aby je mohly využít další příkazy.
Není nic špatného na vykonávání jednotlivých příkazů bez ukládání výsledků jejich práce, ale možnosti takového přístupu jsou velmi omezené.
Existují dva typy proměnných, které lze v bash skriptech použít:
- Proměnné prostředí
- Uživatelské proměnné
Proměnné prostředí
Někdy je potřeba v shellových příkazech pracovat s určitými systémovými daty. Tady je příklad, jak zobrazit domovský adresář aktuálního uživatele:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Všimněte si, že můžeme použít systémovou proměnnou $HOME v dvojitých uvozovkách, což nebrání systému ji rozpoznat. Tohle se stane, když spustíme výše uvedený skript.

Použití environmentální proměnné ve skriptu
A co když chceme na obrazovce zobrazit znak dolaru? Zkusíme to takto:
echo "Mám $1 v kapse" Systém zjistí znak dolaru ve řetězci, který je ohraničen uvozovkami, a rozhodne se, že se odkazujeme na proměnnou. Skript se pokusí na obrazovku vypsat hodnotu nedefinované proměnné $1. To není to, co potřebujeme. Co dělat?
V takové situaci pomůže použití escape znaku, obrácené lomítko, před znakem dolaru:
echo "Mám $1 v kapse"Nyní skript vytiskne právě to, co očekáváme.

Použití escape sekvence pro zobrazení znaku dolaru
Uživatelské proměnné
Kromě environmentálních proměnných umožňují bash skripty také definovat a používat vlastní proměnné. Tyto proměnné si uchovávají hodnotu, dokud není vykonání skriptu dokončeno.
Stejně jako u systémových proměnných, k uživatelským proměnným lze přistupovat pomocí znaku dolaru:
TNW-CUS-FMP — promo kód na slevu 10 % na naše služby, platný k aktivaci po dobu 7 dní
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Takhle to vypadá po spuštění takového skriptu.

Uživatelské proměnné ve skriptu
Zavedení příkazů
Jedna z nejužitečnějších možností bash skriptů je schopnost extrahovat informace z výstupu příkazů a přiřadit je proměnným, což umožňuje použít tyto informace kdekoli v souboru skriptu.
To lze provést dvěma způsoby.
- Pomocí zpětného apostrofu „`“
- Pomocí konstrukce
$()
Při první metodě dbejte na to, abyste místo zpětného apostrofu nezadali jednoduchou uvozovku. Příkaz je třeba uzavřít do dvou takových znaku:
mydir=`pwd`Při druhém přístupu se to stejné zapíše takto:
mydir=$(pwd)A skript může vypadat takto:
#!/bin/bash
mydir=$(pwd)
echo $mydir Během jeho spuštění bude výstup příkazu pwduložen do proměnné mydir, jejíž obsah se pomocí příkazu echo, dostane do konzole.

Skript, který ukládá výsledky práce příkazu do proměnné
Matematické operace
Pro provádění matematických operací v souboru skriptu lze použít konstrukci ve tvaru $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Matematické operace ve scénáři
Řídící konstrukce if-then
V některých scénářích je potřeba řídit tok provádění příkazů. Například, pokud je určitá hodnota větší než pět, je potřeba provést jeden úkon, jinak - jiný. To se hodí v mnoha situacích a zde nám pomůže řídící konstrukce if-then. V nejjednodušší podobě vypadá takto:
if příkaz
then
příkazy
fiA zde je pracovní příklad:
#!/bin/bash
if pwd
then
echo "It works"
fi V tomto případě, pokud provedení příkazu pwdskončí úspěšně, bude do terminálu vypsán text „it works“.
Využijeme naše dosavadní znalosti a napíšeme složitější skript. Řekněme, že je třeba najít určitého uživatele v /etc/passwd, a pokud se ho podaří najít, oznámit, že existuje.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiTohle je výsledek po spuštění tohoto skriptu.

Vyhledání uživatele
Zde jsme použili příkaz greppro vyhledání uživatele v souboru /etc/passwd. Pokud vám příkaz grepnení znám, jeho popis najdete .
V tomto příkladu, pokud je uživatel nalezen, skript vypíše odpovídající zprávu. A co když se uživatele najít nepodaří? V tomto případě skript prostě ukončí provádění, aniž by nám něco řekl. Chtěli bychom, aby nám to také řekl, proto vylepšujeme kód.
Řídící konstrukce if-then-else
Aby program mohl informovat o výsledcích úspěšného vyhledání i o neúspěchu, použijeme konstrukci if-then-else. Takhle je to uspořádáno:
if příkaz
then
příkazy
else
příkazy
fi Pokud první příkaz vrátí nulu, což znamená jeho úspěšné provedení, podmínka se ukáže jako pravdivá a provádění se nevydá větví else. V opačném případě, pokud bude vráceno něco, co se liší od nuly, což by znamenalo neúspěch nebo falešný výsledek, budou provedeny příkazy umístěné za else.
Napišme takový 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 provádění se vydalo větví else.

Spuštění skriptu s konstrukcí if-then-else
Tak co, pokračujeme dále a ptáme se na složitější podmínky. Co když je třeba zkontrolovat nejen jednu podmínku, ale několik? Například, pokud je nalezen požadovaný uživatel, je třeba vypsat jednu zprávu, pokud je splněna další podmínka — další zprávu, a tak dále. V takové situaci nám pomohou vnořené podmínky. Vypadá to takto:
if příkaz1
then
příkazy
elif příkaz2
then
příkazy
fi Pokud první příkaz vrátí nulu, což naznačuje jeho úspěšné provedení, provedou se příkazy v prvním bloku. then, jinak, pokud bude první podmínka nepravdivá a pokud druhý příkaz vrátí nulu, provedou se příkazy ve druhém bloku 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 lze například vytvořit nového uživatele pomocí příkazu useradd, pokud vyhledávání nedalo výsledky, nebo udělat něco jiného užitečného.
Porovnání čísel
Ve skriptech lze porovnávat číselné hodnoty. Níže je uveden seznam příslušných příkazů.
n1 -eq n2Vrací pravdivou hodnotu, pokudn1je rovnon2.
n1 -ge n2Vrací pravdivou hodnotu, pokudn1větší nebo rovnon2.
n1 -gt n2Vrací pravdivou hodnotu, pokudn1většín2.
n1 -le n2Vrací pravdivou hodnotu, pokudn1menší nebo rovnon2.
n1 -lt n2Vrací pravdivou hodnotu, pokud n1 je menšín2.
n1 -ne n2Vrací pravdivou hodnotu, pokudn1není rovnon2.
Jako příklad si vyzkoušejme jeden z porovná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"
fiTohle vypíše tento příkaz.

Porovnání čísel ve skriptech
Hodnota proměnné val1je větší než 5, následně se provede větev thenporovnávacího operátoru a na konzoli se vypíše odpovídající zpráva.
Porovnání řetězců
Ve skriptech lze také porovnávat řetězcové hodnoty. Porovnávací operátory vypadají docela jednoduše, avšak operace porovnávání řetězců mají určité zvláštnosti, které si níže přiblížíme. Zde je seznam operátorů.
str1 = str2Kontroluje rovnost řetězců, vrací pravdu, pokud jsou řetězce identické.
str1 != str2Vrací pravdu, pokud řetězce nejsou identické.
str1 < str2Vrací pravdu, pokudstr1je menší nežstr2.
str1 > str2Vrací pravdu, pokudstr1větší nežstr2.
-n str1Vrací pravdu, pokud délkastr1je větší než nula.
-z str1Vrací pravdu, pokud délkastr1je rovna nule.
Tady 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"
fiNa základě provedení skriptu obdržíme následující.

Porovnání řetězců ve skriptech
Toto je jedna zvláštnost porovnávání řetězců, kterou stojí za to zmínit. A to konkrétně, operátory „>“ a „“ jako příkaz pro 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"
fiToto jsou výsledky provádění skriptu.

Porovnávání řetězců, vypsaná upozornění
Všimněte si, že skript, ačkoli se vykonává, generuje varování:
./myscript: řádek 5: [: příliš mnoho argumentů Abychom se tohoto varování zbavili, uzavřeme $val2 do dvojitých uvozovek:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiNyní vše funguje, jak má.

Porovnání řetězců
Další zvláštností operátorů „>“ a „<“ je to, jak fungují se znaky velkých a malých písmen. Abychom tuto zvláštnost pochopili, připravíme textový soubor s takovým obsahem:
Likegeeks
likegeeks Uložíme ho pod názvem myfile, a poté v terminálu provedeme následující příkaz:
sort myfileTento příkaz seřadí řádky ze souboru takto:
likegeeks
Likegeeks Tým sort, ve výchozím nastavení seřadí řádky vzestupně, což znamená, že malé písmeno v našem příkladu je menší než velké. Nyní 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"
fiPokud jej spustíme, zjistíme, že je to naopak – malé písmeno je nyní větší než velké.

Příkaz sort a porovnání řetězců ve skriptu
V příkazech porovnání jsou velká písmena menší než malá písmena. Porovnání řetězců se zde provádí porovnáním ASCII kódů znaků, tedy pořadí řazení závisí na kódech znaků.
Tým sort, které zase používá pořadí řazení nastavené v systémovém jazyce.
Kontroly souborů
Snad nejčastěji používané příkazy v bash skriptech. Umožňují kontrolovat různé podmínky týkající se souborů. Zde je seznam těchto příkazů.
-d fileKontroluje, zda soubor existuje a zda je adresářem.
-e fileKontroluje, zda soubor existuje.
-f fileKontroluje, zda soubor existuje a zda je souborem.
-r fileKontroluje, zda soubor existuje a zda je přístupný pro čtení.
-s fileKontroluje, zda soubor existuje a zda není prázdný.
-w fileKontroluje, zda soubor existuje a zda je přístupný pro zápis.
-x fileKontroluje, zda soubor existuje a zda je spustitelný.
file1 -nt file2Kontroluje, zda je novější nežfile1, nežfile2.
file1 -ot file2Kontroluje, zda je starší nežfile1, nežfile2.
-O fileKontroluje, zda soubor existuje a zda je jeho vlastníkem aktuální uživatel.
-G fileKontroluje, zda soubor existuje a zda jeho identifikátor skupiny odpovídá identifikátoru skupiny aktuálního uživatele.
Tyto příkazy, stejně jako mnoho dalších, které jsme dnes probrali, se snadno pamatují. Jejich názvy, jako zkratky různých slov, jasně ukazují na kontroly, které provádějí.
Otestujeme 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"
fiTento skript, pro existující adresář, zobrazí jeho obsah.

Výstup obsahu adresáře
Předpokládáme, že s ostatními příkazy si budete moci experimentovat sami, všechny se používají podle stejných principů.
Závěry
Dnes jsme hovořili o tom, jak začít psát bash skripty a probrali jsme některé základní věci. Téma bash programování je ve skutečnosti obrovské. Tento článek je překlad první části velké série 11 materiálů. Pokud chcete pokračování hned teď — zde je seznam originálů těchto materiálů. Pro pohodlí byl zahrnut i ten, který jste právě přečetli.
- — zde jde o to, jak začít s vytvářením bash skriptů, probráno je použití proměnných, popsány jsou podmínkové struktury, výpočty, porovnávání čísel, řetězců, zjišťování informací o souborech.
- — zde se odhalují zvláštnosti práce s cykly for a while.
- — tento materiál je věnován parametrům příkazového řádku a přepínačům, které lze předávat skriptům, práci s údaji, které uživatel zadává, a které lze číst ze souborů.
- — zde jde o popisovače souborů a práci s nimi, o toky vstupu, výstupu, chyb, o přesměrování výstupu.
- — tento materiál se věnuje signálům v Linuxu, jejich zpracování ve skriptech, spouštění scénářů podle plánu.
- — zde se můžete dozvědět o vytváření a používání funkcí ve skriptech, o vývoji knihoven.
- — tento článek se věnuje práci se streamovým textovým editorem sed.
- — tento materiál se věnuje programování v jazyce pro zpracování dat awk.
- — zde si můžete přečíst o použití regulárních výrazů v bash skriptech.
- — zde jsou uvedeny techniky práce s zprávami, které lze posílat uživatelům, a také metodika monitorování disku.
- — tento materiál se věnuje nástroji Expect, pomocí kterého lze automatizovat interakci s interaktivními utilitami. Zde je zejména řeč o expect skriptech a jejich interakci s bash skripty a jinými programy.
Domníváme se, že jednou z cenných vlastností této série článků je, že začíná od nejjednoduššího, vhodného pro uživatele jakékoliv úrovně, a postupně vede k poměrně složitým tématům, čímž dává šanci všem zájemcům pokročit v oblasti vytváření skriptů pro příkazovou řádku Linuxu.
Vážení čtenáři! Prosíme guru bash programování, aby se podělili o to, jak dosáhli vrcholků mistrovství, a podělili se o tajemství, a od těch, kteří právě napsali svůj první skript, čekáme na dojmy.
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Přeložit ostatní části cyklu článků?
Ano!
Ne, není třeba
Hlasovalo 1030 uživatelů. Zdrželo se 106 uživatelů.
Zdroj: habr.com
