V tomto tutoriálu budeme hovořit o skriptování shellu a o tom, jak vytvořit svůj první skript shell. Obecně se jim říká skripty shellu, ale budeme je nazývat skripty Bash, protože mezi ostatními shelly Linuxu budeme používat Bash.
Existují zsh, tcsh, ksh a další shelly.
V předchozích příspěvcích jsme viděli, jak používat shell Bash a jak používat příkazy Linuxu.
Koncept Bash skriptu je spouštět řadu příkazů, aby byla vaše práce hotová.
Chcete-li spustit více příkazů v jednom kroku z shellu, můžete je napsat na jeden řádek a oddělit je středníkem.
pwd ; whoami
Toto je Bash skript!!
Nejprve se spustí příkaz pwd, který zobrazí aktuální pracovní adresář, poté se spustí příkaz whoami, který zobrazí aktuálně přihlášené uživatele.
Můžete spustit více příkazů, kolik chcete, ale s omezením. Pomocí tohoto příkazu můžete určit své maximální argumenty.
getconf ARG_MAX
No, co takhle vložit příkazy do souboru, a když potřebujeme spustit tyto příkazy, spustíme pouze tento soubor. Tomu se říká Bash skript.
Nejprve vytvořte nový soubor pomocí dotykového příkazu. Na začátku každého Bash skriptu bychom měli definovat, který shell budeme používat, protože v Linuxu je mnoho shellů, Bash shell je jedním z nich.
Shell skript shebang
První řádek, který zadáte při psaní Bash skriptu, je (#!), za nímž následuje shell, který použijete.
#! <===tento znak se nazývá shebang.
#!/bin/bash
Pokud použijete znak libry (#) před libovolným řádkem ve skriptu shellu, tento řádek se stane komentářem, což znamená, že nebude zpracován, ale výše uvedený řádek je speciální případ . Tento řádek definuje, jaký shell budeme používat, což je v našem případě Bash shell.
Příkazy shellu se zadávají jeden na řádek takto:
#!/bin/bash # This is a comment pwd whoami
Na jeden řádek můžete napsat více příkazů, ale musíte je oddělit středníky, ale je lepší psát příkazy na samostatné řádky; to usnadní pozdější čtení.
Nastavit oprávnění skriptu
Po napsání skriptu shellu soubor uložte.
Nyní nastavte tento soubor jako spustitelný; jinak vám povolení odepře. Můžete si přečíst, jak nastavit oprávnění pomocí příkazu chmod.
chmod +x ./myscript
Pak to zkuste spustit pouhým zadáním do shellu:
./myscript
A ano, je proveden.
Vytvořte svůj první skript Bash
Jak víme z jiných příspěvků, tisk textu se neprovádí pomocí
echo
příkaz.
Upravte svůj soubor a zadejte toto:
#!/bin/bash # our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami
Podívejte se na výstup:
Perfektní! Nyní můžeme spouštět příkazy a zobrazovat text:
echo
Pokud neznáte příkaz echo nebo jak upravit soubor, doporučuji vám přečíst si předchozí články o základních příkazech Linuxu.
Použití proměnných
Proměnné vám umožňují ukládat informace, abyste je mohli použít ve vašem skriptu.
Ve skriptu shellu můžete definovat dva typy proměnných:
- Proměnné prostředí
- Uživatelské proměnné
Proměnné prostředí
Někdy je potřeba interagovat se systémovými proměnnými; můžete to udělat pomocí proměnných prostředí.
#!/bin/bash # display user home echo "Home for the current user is: $HOME"
Všimněte si, že jsme systémovou proměnnou $HOME vložili mezi dvojité uvozovky a ta vypíše proměnnou home správně.
Co když chceme vytisknout samotný znak dolaru?
echo "I have $1 in my pocket"
Protože proměnná 1 $ neexistuje, nebude fungovat. Jak to tedy překonat?
Můžete použít znak escape, což je zpětné lomítko \ před znakem dolaru takto:
echo "I have \$1 in my pocket"
Teď to funguje!!
Uživatelské proměnné
Ve skriptu také můžete nastavit a používat vlastní proměnné.
Uživatelské proměnné můžete volat stejným způsobem, jako je tento:
#!/bin/bash # User variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
chmod +x myscript ./myscript
Náhrada příkazů
Informace z výsledku příkazu můžete extrahovat pomocí substituce příkazů.
Náhradu příkazů můžete provést jednou z následujících metod:
- Znak zpětného zaškrtnutí (`).
- Formát $().
Ujistěte se, že když zadáváte znak zpětného zaškrtnutí, není to jednoduchá uvozovka.
Příkaz musíte uzavřít dvěma zpětnými zaškrtnutími takto:
mydir=`pwd`
Nebo jinak:
mydir=$(pwd)
Skript by tedy mohl vypadat takto:
#!/bin/bash mydir=$(pwd) echo $mydir
Výstup příkazu můžete uložit do proměnné mydir.
Matematický výpočet
Základní matematické výpočty můžete provádět pomocí $(( 2 + 2 )) formátu:
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2
Tak snadné.
příkaz if-then
Vaše skripty shellu budou potřebovat podmíněné příkazy. Pokud je hodnota menší než 10, udělejte to jinak. Můžete si představit jakoukoli logiku, kterou chcete.
Nejzákladnější struktura příkazu if-then je tato:
příkaz if; pak
udělat něco
fi
a zde je příklad:
#!/bin/bash if whoami; then echo "It works" fi
Od
whoami
vrátí mého uživatele, takže podmínka se vrátí jako true a vytiskne zprávu.
Pojďme se ponořit hlouběji a použít další příkazy, které známe.
Zkontrolujte, zda uživatel existuje
Možná hledání konkrétního uživatele v souboru uživatele
/etc/passwd
a pokud záznam existuje, řekněte mi to ve zprávě.
#!/bin/bash user=likegeeks if grep $user /etc/passwd; then echo "No such a user $user" fi
Používáme
/etc/passwd
soubor. Můžete se podívat na náš tutoriál o příkazu grep.
Pokud uživatel existuje, skript shellu zprávu vytiskne.
Co když uživatel neexistuje? Skript ukončí provádění, aniž by nám řekl, že uživatel neexistuje. Dobře, pojďme skript ještě vylepšit.
příkaz if-then-else
Příkaz if-then-else má následující strukturu:
příkaz if; pak
udělat něco
jinak
udělat jinou věc
fi
Pokud se první příkaz spustí a vrátí nulu, což znamená úspěch, nezasáhne příkazy po příkazu else; jinak, pokud příkaz if vrátí nenulovou hodnotu; což znamená, že podmínka příkazu selže, v tomto případě shell zasáhne příkazy po příkazu else.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi
Zatím se nám daří, pokračujte v pohybu.
A teď, co když potřebujeme další prohlášení.
No, to je snadné, toho můžeme dosáhnout vnořením příkazů if typu:
if podmínka1; pak
příkazy
elif podmínka2; pak
příkazy
fi
Pokud první příkaz vrátí nulu; znamená úspěch, provede příkazy za ním, jinak pokud druhý příkaz vrátí nulu, spustí příkazy za ním, jinak pokud žádný z nich nevrátí nulu, provede pouze poslední příkazy.
#!/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" fi
Můžete si představit jakýkoli scénář, možná pokud uživatel neexistuje, vytvořte uživatele pomocí
useradd
příkaz nebo něco jiného.
Kombinovat testy
Pomocí příkazu AND (&&) nebo OR (||) můžete kombinovat více testů.
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] && [ -n $name ]; then echo "The name exists and the folder $dir exists." else echo "One test failed" fi
Tento příklad vrátí hodnotu true pouze v případě, že oba testy uspěly; jinak selže.
Také můžete použít OR (||) stejným způsobem:
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] || [ -n $name ]; then echo "Success!" else echo "Both tests failed" fi
Tento příklad by vrátil úspěch, pokud by jeden nebo oba uspěli.
Selhal by pouze v případě, že by selhaly oba.
Číselná srovnání
Číselné srovnání mezi dvěma číselnými hodnotami můžete provést pomocí kontrol číselného porovnání takto:
číslo1 -eq číslo2 Zkontroluje, zda se číslo1 rovná číslu2.
číslo1 -ge číslo2 Zkontroluje, zda je číslo1 větší nebo rovno číslu2.
číslo1 -gt číslo2 Zkontroluje, zda je číslo1 větší než číslo2.
číslo1 -le číslo2 Zkontroluje, zda je číslo1 menší nebo rovno číslu2.
číslo1 -lt číslo2 Zkontroluje, zda je číslo1 menší než číslo2.
číslo1 -ne číslo2 Zkontroluje, zda číslo1 není rovno číslu2.
Jako příklad vyzkoušíme jeden z nich a zbytek je stejný.
Všimněte si, že porovnávací příkaz je v hranatých závorkách, jak je znázorněno.
#!/bin/bash num=11 if [ $num -gt 10]; then echo "$num is bigger than 10" else echo "$num is less than 10" fi
Číslo je větší než deset, takže spustí první příkaz a vytiskne první echo.
Porovnání řetězců
Řetězce můžete porovnat jedním z následujících způsobů:
string1 =string2 Zkontroluje, zda string1 identický s string2.
string1 !=string2 Zkontroluje, zda string1 není identický s string2.
řetězec1 <řetězec2 Zkontroluje, zda je řetězec1 menší než řetězec2.
řetězec1> řetězec2 Zkontroluje, zda je řetězec1 větší než řetězec2.
-n řetězec1 Zkontroluje, zda je řetězec1 delší než nula.
-z řetězec1 Zkontroluje, zda má řetězec1 nulovou délku.
Na náš příklad můžeme použít porovnání řetězců:
#!/bin/bash user="likegeeks" if [ $user = $USER ]; then echo "The user $user is the current logged in user" fi
Jedna záludná poznámka o větším než a menším než pro porovnání řetězců MUSÍ být uniknut pomocí zpětného lomítka protože pokud použijete pouze symbol větší než, zobrazí se nesprávné výsledky.
Takže byste to měli udělat takto:
#!/bin/bash v1=text v2="another text" if [ $v1 \> "$v2" ]; then echo "$v1 is greater than $v2" else echo "$v1 is less than $v2" fi
Spustí se, ale zobrazí toto varování:
./myscript: line 5: [: too many arguments
Chcete-li to opravit, zabalte $vals do dvojitých uvozovek a přinutíte je zůstat jako jeden řetězec takto:
#!/bin/bash v1=text v2="another text" if [ $v1 \> "$v2" ]; then echo "$v1 is greater than $v2" else echo "$v1 is less than $v2" fi
Kritická poznámka o větším než a menším než pro srovnání řetězců. Podívejte se na následující příklad, abyste pochopili rozdíl:
#!/bin/bash v1=Likegeeks v2=likegeeks if [ $v1 \> $v2 ]; then echo "$v1 is greater than $v2" else echo "$v1 is less than $v2" fi
sort myfile
likegeeks
Likegeeks
Testovací podmínka bere v úvahu malá písmena větší než velká písmena.
sort
Na rozdíl od příkazu sort, který dělá opak.
Testovací podmínka je založena na pořadí ASCII.
sort
Zatímco příkaz řazení je založen na pořadí číslování ze systémových nastavení.
Porovnání souborů
Soubory můžete porovnávat a kontrolovat pomocí následujících operátorů:
-d můj_soubor Zkontroluje, zda se jedná o složku.
-e můj_soubor Zkontroluje, zda je soubor dostupný.
-f můj_soubor Zkontroluje, zda se jedná o soubor.
-r my_file Zkontroluje, zda je čitelný.
můj_soubor – nt my_file2 Zkontroluje, zda je můj_soubor novější než můj_soubor2.
můj_soubor – ot my_file2 Zkontroluje, zda je můj_soubor starší než můj_soubor2.
-O můj_soubor Zkontroluje, zda se vlastník souboru a přihlášený uživatel shodují.
-G můj_soubor Zkontroluje, zda soubor a přihlášený uživatel mají identickou skupinu.
Jak naznačují, nikdy na ně nezapomenete.
Vyberme jednu z nich a vezměme si ji jako příklad:
#!/bin/bash mydir=/home/likegeeks if [ -d $mydir ]; then echo "Directory $mydir exists" cd $mydir ls else echo "NO such file or directory $mydir" fi
Nebudeme uvádět každý z nich jako příklad. Jednoduše zadáte srovnání mezi hranatými závorkami tak, jak je, a dokončíte skript normálně.
Existuje několik dalších pokročilých funkcí typu if-then, ale pojďme si to představit v jiném příspěvku.
To je prozatím. Doufám, že se vám to bude líbit a budete trénovat víc a víc.
Děkuji.