Udělejme naše bash skripty inteligentní!
V této části bash série pro začátečníky se naučíte, jak používat podmíněné příkazy ve vašich bash skriptech, aby se chovaly odlišně v různých scénářích a případech.
Tímto způsobem můžete vytvářet mnohem efektivnější bash skripty a také můžete ve svých skriptech implementovat kontrolu chyb.
Použití příkazu if v bash
Nejzákladnějším konstruktem v jakékoli rozhodovací struktuře je podmínka if. Obecná syntaxe základního příkazu if je následující:
if [ condition ]; then
your code
fi
if
příkaz je uzavřen znakem fi
(opak if).
Dávejte pozor na mezery!
- Mezi otevírací a uzavírací závorkou a podmínkou, kterou zapisujete, musí být mezera. Jinak si shell bude stěžovat na chybu.
- Před a za podmíněným operátorem (=, ==, <=atd.) musí být mezera. V opačném případě se zobrazí chyba jako „očekává se unární operátor“.
Nyní vytvoříme ukázkový skript root.sh. Tento skript bude opakovat prohlášení „jste root“ pouze v případě, že skript spustíte jako uživatel root:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
fi
whoami
příkaz vypíše uživatelské jméno. Z výukového programu proměnných bash víte, že $(command)
syntaxe se používá pro substituci příkazů a poskytuje výstup příkazu.
Podmínka $(whoami) = 'root'
bude true pouze v případě, že jste přihlášeni jako uživatel root.
nevěříš mi? Nemusíš. Spusťte to a uvidíte to sami.
Použití příkazu if-else v bash
Možná jste si všimli, že při spuštění root.sh nezískáte žádný výstup skript jako běžný uživatel. Jakýkoli kód, který chcete spustit, když je podmínka if vyhodnocena jako nepravda, lze zahrnout do příkazu else takto:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Nyní, když spustíte skript jako běžný uživatel, bude vám připomenuto, že nejste všemohoucí uživatel root:
[email protected]:~$ ./root.sh
You are not root
Použití příkazu else if v bash
Příkaz elif (else-if) můžete použít, kdykoli chcete testovat více než jeden výraz (podmínku) současně.
Například následující age.sh bash skript vezme váš věk jako argument a vydá smysluplnou zprávu, která odpovídá vašemu věku:
#!/bin/bash
AGE=$1
if [ $AGE -lt 13 ]; then
echo "You are a kid."
elif [ $AGE -lt 20 ]; then
echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
echo "You are an adult."
else
echo "You are an elder."
fi
Nyní proveďte několik spuštění age.sh skript k otestování v různých věkových skupinách:
[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.
Všimněte si, že jsem použil -lt
(menší než) testovací podmínka s proměnnou $AGE.
Uvědomte si také, že můžete mít více elif
příkazy, ale pouze jeden else
příkaz v konstrukci if a musí být uzavřen pomocí fi
.
Použití vnořených příkazů if v bash
Příkaz if můžete také použít v rámci jiného příkazu if. Podívejte se například na následující weather.sh bash skript:
#!/bin/bash
TEMP=$1
if [ $TEMP -gt 5 ]; then
if [ $TEMP -lt 15 ]; then
echo "The weather is cold."
elif [ $TEMP -lt 25 ]; then
echo "The weather is nice."
else
echo "The weather is hot."
fi
else
echo "It's freezing outside ..."
fi
Skript vezme libovolnou teplotu jako argument a poté zobrazí zprávu, která odráží, jaké by bylo počasí. Pokud je teplota vyšší než pět, vyhodnotí se vnořený (vnitřní) příkaz if-elif. Udělejme několik spuštění skriptu, abychom viděli, jak to funguje:
[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.
Použití příkazu Case v bash
Můžete také použít příkazy case v bash k nahrazení více příkazů if, protože jsou někdy matoucí a těžko čitelné. Obecná syntaxe konstrukce typu case je následující:
case "variable" in
"pattern1" )
Command … ;;
"pattern2" )
Command … ;;
"pattern2" )
Command … ;;
esac
Dávejte pozor!
- Za vzory vždy následuje mezera a
)
. - Za příkazy vždy následuje dvojitý středník
;;
. Mezera před ním není povinná. - Příkazy případu končí
esac
(obrácený případ).
Příkazy typu case jsou zvláště užitečné při práci s porovnáváním vzorů nebo regulárními výrazy. Chcete-li to demonstrovat, podívejte se na následující char.sh bash skript:
#!/bin/bash
CHAR=$1
case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac
Skript vezme jeden znak jako argument a zobrazí, zda je znakem malá/velká abeceda, číslo nebo speciální znak.
[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.
Všimněte si, že jsem použil zástupný symbol hvězdičky (*) k definování výchozího případu, který je ekvivalentem příkazu else v podmínce if.
Testovací podmínky v bash
Existuje mnoho testovacích podmínek, které můžete použít s příkazy if. Podmínky testu se liší, pokud pracujete s čísly, řetězci nebo soubory. Představte si je jako logické operátory v bash.
Do tabulky níže jsem zahrnul některé z nejoblíbenějších testovacích podmínek:
Podmínka | Ekvivalentní |
---|---|
$a -lt $b | $a <$b |
$a -gt $b | $a> $b |
$a -le $b | $a <=$b |
$a -ge $b | $a>=$b |
$a -eq $b | $a se rovná $b |
$a -ne $b | $a se nerovná $b |
-e $FILE | $FILE existuje |
-d $FILE | $FILE existuje a je to adresář. |
-f $FILE | $FILE existuje a je to běžný soubor. |
-L $FILE | $FILE existuje a je to měkký odkaz. |
$STRING1 =$STRING2 | $STRING1 se rovná $STRING2 |
$STRING1 !=STRING2$ | $STRING1 se nerovná $STRING2 |
-z $ STRING1 | $STRING1 je prázdný |
Naštěstí si nemusíte pamatovat žádné z testovacích podmínek, protože je můžete vyhledat na testovací manuálové stránce:
[email protected]:~$ man test
Pojďme vytvořit jeden finální skript s názvem filetype.sh který zjišťuje, zda je soubor běžným souborem, adresářem nebo měkkým odkazem:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Error: Invalid number of arguments"
exit 1
fi
file=$1
if [ -f $file ]; then
echo "$file is a regular file."
elif [ -L $file ]; then
echo "$file is a soft link."
elif [ -d $file ]; then
echo "$file is a directory."
else
echo "$file does not exist"
fi
Skript jsem trochu vylepšil přidáním kontroly počtu argumentů. Pokud neexistují žádné argumenty nebo více než jeden argument, skript vypíše zprávu a ukončí se bez spuštění zbývajících příkazů ve skriptu.
Udělejme několik spuštění skriptu, abychom jej otestovali s různými typy souborů:
[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh
Error: Invalid number of arguments
Bonus:Bash if else na jednom řádku
Doposud byly všechny příkazy if else, které jste viděli, použity ve správném bash skriptu. To je slušný způsob, jak to udělat, ale nejste k tomu povinni.
Pokud chcete vidět výsledek v samotném shellu, můžete použít příkaz if else na jednom řádku v bash.
Předpokládejme, že máte tento bash skript.
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Můžete použít všechny příkazy if else na jednom řádku takto:
if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi
Výše uvedené můžete zkopírovat a vložit do terminálu a sami uvidíte výsledek.
V podstatě stačí přidat středníky za příkazy a poté přidat další příkaz if-else.
Úžasný! To by vám mělo poskytnout dobré porozumění podmíněným příkazům v Bash. Doufám, že jste si užili vylepšování bash skriptů!
Své nově naučené znalosti si můžete otestovat procvičováním jednoduchých bashových cvičení v PDF níže. Obsahuje také řešení.
Bash Kapitola 7 Cvičné otázkyProblémy a jejich řešení k procvičení toho, co jste se právě naučili v této kapitole Bash-Kapitola-7-Procvičení-otázek-Linux-Příručka.pdf31 KB
Zůstaňte naladěni na příští týden, protože se naučíte používat různé konstrukce smyček ve svých bash skriptech.