Ahoj! Základy skriptování shellu, jako je přijímání vstupů, zpracování dat pomocí aritmetických operací a generování a zobrazování výstupu, jsme již probrali v předchozích částech tohoto tutoriálu (část 1 a část 2). V této části půjdeme hlouběji k pokročilejšímu tématu v programovacím jazyce -- rozhodování v programu, ale tentokrát to uděláme pomocí bash shellu. Začněme!
Úvod
Většina našich dnešních programovacích jazyků je schopna se rozhodovat na základě námi stanovených podmínek. Podmínka je výraz, který se vyhodnotí jako logická hodnota – pravda nebo nepravda. Každý programátor může udělat svůj program chytrým na základě rozhodnutí a logiky, kterou do svého programu vloží. Shell bash podporuje příkazy if a switch (case).
Příkaz If
If je příkaz, který umožňuje programátorovi rozhodnout se v programu na základě podmínek, které zadal. Pokud je podmínka splněna, program provede určité řádky kódu, jinak program provede jiné úlohy, které programátor zadal. Níže je uvedena podporovaná syntaxe příkazu if v prostředí bash.
Obecná syntaxe
Jediné rozhodnutí:
if <condition>
then
### series of code goes here
fi
Dvojité rozhodnutí:
if <condition>
then
### series of code if the condition is satisfied
else
### series of code if the condition is not satisfied
fi
Vícenásobná podmínka if:
if <condition1>
then
### series of code for condition1
elif <condition2>
then
### series of code for condition2
else
### series of code if the condition is not satisfied
fi
Syntaxe s jednou závorkou
if [ condition ]
then
### series of code goes here
fi
Syntaxe se dvěma závorkami
if ((condition))
then
### series of code goes here
fi
Syntaxe s jednou závorkou je nejstarší podporovaná syntaxe v bash shellu. Používá se společně se všemi podmíněnými příkazy v Linuxu. Mezitím se syntaxe s dvojitými závorkami používá pro podmíněný příkaz založený na číslech, který poskytuje programátorům známou syntaxi. Všechny typy příkazů if potřebují k provedení úlohy určitou podmínku.
Podmíněné příkazy v Linuxu
Podmíněné příkazy se používají společně s příkazem kontroly rozhodování. V bash shellu můžete použít různé typy podmíněných příkazů, nejběžnější jsou:souborové, řetězcové a aritmetické podmínky.
Podmínka založená na souboru
Podmínky založené na souboru jsou unární výrazy a často se používají ke zkoumání stavu souboru. Následující seznam ukazuje nejběžněji používané podmínky založené na souborech v prostředí bash.
Operátor | Popis |
-soubor | Vrátí hodnotu true, pokud soubor existuje |
soubor -b | Vrátí hodnotu true, pokud soubor existuje a jedná se o speciální blokový soubor |
-c soubor | Vrátí hodnotu true, pokud soubor existuje a jedná se o speciální znakový soubor |
soubor -d | Vrátí hodnotu true, pokud soubor existuje a jedná se o adresář |
-e soubor | Vrátí hodnotu true, pokud soubor existuje |
soubor -r | Vrátí hodnotu true, pokud soubor existuje a je čitelný |
soubor -s | Vrátí hodnotu true, pokud soubor existuje a má větší velikost než nula |
soubor -s | Vrátí hodnotu true, pokud soubor existuje a má větší velikost než nula |
soubor -w | Vrátí hodnotu true, pokud soubor existuje a je možné do něj zapisovat |
-x soubor | Vrátí hodnotu true, pokud soubor existuje a je spustitelný |
-N soubor | Vrátí hodnotu true, pokud soubor existuje a byl od posledního přečtení změněn |
Rozhodování na základě souboru
Uveďme příklad, který bude ilustrovat, jak vytvořit rozhodnutí založené na souboru ve skriptu bash. V tomto příkladu vytvoříme skript, který určí, zda soubor existuje v domovském adresáři.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "file exists!"
else
echo "file does not exist"
fi
V tomto příkladu jsme pomocí příkazu cd zajistili, že se shell vrátí do domovského adresáře bez ohledu na náš aktuální aktivní adresář. Příkaz ls se navíc používá k zobrazení seznamu souborů v adresáři, abychom mohli ověřit, zda soubor skutečně existuje nebo ne. Jak můžete vidět, skript vypíše text "soubor existuje!" protože sample.sh je v domovském adresáři.
Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.
Nyní vylepšeme náš skript tím, že uděláme náš kód dynamičtějším tím, že umožníme uživateli zadat název skriptu a určit oprávnění daného souboru.
#!/bin/bash
cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
echo "file exists!"
if [ -r $filename ]
then
status="readable "
fi
if [ -w $filename ]
then
status=$status"writable "
fi
if [ -x $filename ]
then
status=$status"executable"
fi
echo "file permission: "$status
else
echo "file does not exist"
fi
Podmínka založená na řetězci
Rozhodování na základě zadání řetězce uživatelem je také možné v bash shellu. Řetězcová podmínka vrací jako výsledek binární výraz, vrací true, pokud je zadaná podmínka splněna jinak, vrací false. Následují běžně používané podmíněné operátory založené na řetězcích:
Operátor | Popis |
== | Vrátí hodnotu true, pokud jsou řetězce stejné |
!= | Vrátí hodnotu true, pokud se řetězce neshodují |
-n | Vrátí hodnotu true, pokud testovaný řetězec není null |
-z | Vrátí hodnotu true, pokud je testovaný řetězec null |
Vytvořme ukázkový skript pomocí podmíněného příkazu založeného na řetězcích. Skript umožní uživateli zadat dva řetězce a posoudit, zda je jeden z řetězců prázdný, oba řetězce jsou stejné a různé.
#!/bin/bash
read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
echo "The 1st string is null"
elif [ -z "$str2" ]
then
echo "The 2nd string is null"
else
if [ $str1 == $str2 ]
then
echo "The strings are equal"
else
echo "The strings are not equal"
fi
fi
Podmínka založená na aritmetice
Shell poskytuje několik způsobů, jak deklarovat podmínku založenou na aritmetice. První je pomocí mnemotechnických pomůcek, které lze použít společně se starou syntaxí s jednoduchými závorkami, a druhou pomocí matematicky vhodných symbolů, které lze použít společně s dvojitou závorkou
Níže je seznam dostupných mnemotechnických pomůcek pro aritmeticky založené podmíněné příkazy v shellu:
Operátor | Použití/Popis |
-eq | Rovno |
-ge | Větší než nebo rovno |
-gt | Větší než |
-le | Menší než nebo rovno |
-lt | Méně než |
-ne | Nerovná se |
Vytvořme skript, který přijme celé číslo od uživatele a určí, zda je celé číslo nula, záporné, liché nebo sudé číslo.
#!/bin/bash
read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
echo "Zero"
elif [ $int1 -lt 0 ]
then
echo "Negative"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Even"
else
echo "Odd"
fi
fi
Aritmetický operátor pro syntaxi dvojitých závorek:
Operátor | Použití/Popis |
== | Rovno |
>= | Větší než nebo rovno |
> | Větší než |
<= | Menší než nebo rovno |
< | Méně než |
!= | Nerovná se |
Nyní zrekonstruujeme náš předchozí skript a použijeme syntaxi dvojitých závorek:
#!/bin/bash
read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
echo "Zero"
elif (( $int1 < 0 ))
then
echo "Negative"
else
if (( $((int1%2)) == 0 ))
then
echo "Even"
else
echo "Odd"
fi
fi
Příkaz přepínače
Příkaz switch je dalším druhem podmíněného příkazu ve skriptování shellu. Umožňuje programátorovi porovnat několik hodnot s proměnnou snáze ve srovnání s podmíněným příkazem if. Syntaxe příkazu switch je:
casein
<pattern1>)
##series of code for pattern1
;;
<pattern2>)
##series of code for pattern2
;;
<patternN>)
##series of code for patternN
;;
*)
##default statements
esac
Vzor je možná hodnota proměnné. Každý vzor je oddělen dvojitým středníkem, který slouží jako příkaz přerušení vzoru. Příkaz switch je ukončen příkazem esac.
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Invalid input"
esac
echo "The result is: " $res
Závěr
Bash shell poskytuje mnoho užitečných nástrojů pro programátory. Stejně jako většina dnešních programovacích jazyků je také schopen provádět podmíněná rozhodnutí, díky nimž jsou skripty shellu interaktivnější a chytřejší. V příští sérii představíme opakující se strukturu ovládání. 'Až příště.
Odkazy
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
Další lekce: Struktury řízení opakování