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.
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í.
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.
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á.
Ú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.
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.
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á.
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.
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.
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)):
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.
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.
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.
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í.
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.
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á.
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é.
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.
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.
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.
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ů.
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.
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ář.
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í.