Bash skripty: úvod

Bash skripty: úvod
Bash skripty, část 2: cykly
Bash skripty, část 3: parametry a argumenty 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 skripty, část 6: funkce a vývoj knihoven
Bash skripty, část 7: sed a zpracování textu
Bash skripty, část 8: jazyk zpracování dat awk
Bash skripty, část 9: regulární výrazy
Bash skripty, část 10: praktické příklady
Bash skripty, část 11: expect a automatizace interaktivních nástrojů

Dnes se budeme bavit o bash skriptech. Toto jsou příkazy příkazového řádku, 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 příkazovém řádku Linuxu.

Bash skripty: úvod

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ů.

Bash skripty: úvod

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_MAX

Pří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á shebang) 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
whoami

Tady, 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.

Bash skripty: úvod
Pokusu o spuštění souboru skriptu s nesprávně nastavenými oprávněními

Udělejme soubor spustitelným:

chmod +x ./myscript

Nyní se pokusíme jej spustit:

./myscript

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

Bash skripty: úvod
Ú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:"
whoami

Takto to vypadá po spuštění aktualizovaného skriptu.

Bash skripty: úvod
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 tento 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.

Bash skripty: úvod
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.

Bash skripty: úvod
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.

Bash skripty: úvod
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.

Bash skripty: úvod
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

Bash skripty: úvod
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
fi

A 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"
fi

Tohle je výsledek po spuštění tohoto skriptu.

Bash skripty: úvod
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 zde.

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.

Bash skripty: úvod
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, pokud n1 je rovno n2.
n1 -ge n2 Vrací pravdivou hodnotu, pokud n1větší nebo rovno n2.
n1 -gt n2Vrací pravdivou hodnotu, pokud n1 větší n2.
n1 -le n2Vrací pravdivou hodnotu, pokud n1menší nebo rovno n2.
n1 -lt n2Vrací pravdivou hodnotu, pokud n1 je menší n2.
n1 -ne n2Vrací pravdivou hodnotu, pokud n1není rovno n2.

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"
fi

Tohle vypíše tento příkaz.

Bash skripty: úvod
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 = str2 Kontroluje rovnost řetězců, vrací pravdu, pokud jsou řetězce identické.
str1 != str2Vrací pravdu, pokud řetězce nejsou identické.
str1 < str2Vrací pravdu, pokud str1je menší než str2.
str1 > str2 Vrací pravdu, pokud str1větší než str2.
-n str1 Vrací pravdu, pokud délka str1je větší než nula.
-z str1Vrací pravdu, pokud délka str1je 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"
fi

Na základě provedení skriptu obdržíme následující.

Bash skripty: úvod
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"
fi

Toto jsou výsledky provádění skriptu.

Bash skripty: úvod
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"
fi

Nyní vše funguje, jak má.

Bash skripty: úvod
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 myfile

Tento 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"
fi

Pokud jej spustíme, zjistíme, že je to naopak – malé písmeno je nyní větší než velké.

Bash skripty: úvod
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 file Kontroluje, 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 file2 Kontroluje, zda je novější než file1, než file2.
file1 -ot file2Kontroluje, zda je starší než file1, než file2.
-O file Kontroluje, 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"
fi

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

Bash skripty: úvod
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.

  1. Bash Skript Krok za Krokem — 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.
  2. Bash Skriptování Část 2, Bash úžasný — zde se odhalují zvláštnosti práce s cykly for a while.
  3. Bash Skriptování Část 3, Parametry & možnosti — 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ů.
  4. Bash Skriptování Část 4, Vstup & Výstup — zde jde o popisovače souborů a práci s nimi, o toky vstupu, výstupu, chyb, o přesměrování výstupu.
  5. Bash Skriptování Část 5, Signálů & Úloh — tento materiál se věnuje signálům v Linuxu, jejich zpracování ve skriptech, spouštění scénářů podle plánu.
  6. Bash Skriptování Část 6, Funkce — zde se můžete dozvědět o vytváření a používání funkcí ve skriptech, o vývoji knihoven.
  7. Bash Skriptování Část 7, Používání sed — tento článek se věnuje práci se streamovým textovým editorem sed.
  8. Bash Skriptování Část 8, Používání awk — tento materiál se věnuje programování v jazyce pro 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 techniky práce s zprávami, které lze posílat uživatelům, a také metodika monitorování disku.
  11. Bash Scripting Část 11, Expect Command — 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.

Bash skripty: úvod

Pouze registrovaní uživatelé se mohou účastnit ankety. Přihlaste se, 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster