Linux: Skripty - větvení



1. 💾 Větvení: if, else (existuje.sh)

Vytvořte cvičný soubor ~/existuje.sh s následujícím skriptem:

#!/bin/bash
echo "Zapiš název souboru:"
read nazev
if test -f $nazev
then
  echo "Soubor existuje."
else
  echo "Soubor neexistuje!"
fi

Podmínka test -f vrací 1 (TRUE), je-li $nazev soubor.

2. Nahrazení příkazu test závorkami

Častěji se příkaz test nahrazuje hranatými závorkami. Ty musí být z obou stran odsazené mezerou (je to příkaz):

if [ -f $nazev ]

Opravte v předchozím skriptu a vyzkoušejte.

3. Parametry testu

Parametry příkazu test nebo „závorkové“ konstrukce [ -f $nazev ]:

[ -e soubor ]             soubor existuje
[ -f soubor ]             je to soubor
[ -d soubor ]             je to adresář
[ -s soubor ]             velikost souboru není 0
[ -r soubor ]             soubor jde číst
[ -w soubor ]             do souboru jde zapisovat
[ -x soubor ]             soubor je spustitelný
[ souborA -nt souborB ]   první soubor je novější
[ souborA -no souborB ]   první soubor je starší

Nejsou to všechny parametry. Další „tradičně“ na man test.

4. 💾 Cvičení: ucet.sh

Napište skript ~/ucet.sh, který ze vstupu načte zadané uživatelské jméno. Následně jej porovná s názvem vašeho uživatelského jména a vypíše zprávu, zda je nebo není shodné.

Jméno přihlášeného uživatele vypíše příkaz whoami:

$ whoami
karel

5. Relační (porovnávací) operátory

Všechny proměnné v shellu jsou jednoho datového typu. Nemá ani typovou konverzi. To vysvětluje, proč se řetězce a čísla porovnávají níže popsaným způsobem. výraz, výraz1 i výraz2 vrací řetězec. Teprve když ho chceme porovnávat jako číslo, tak ho shell bere jako číslo.

Pokud je výraz TRUE vrací 1, jinak vrací 0 (FALSE).

[ výraz ]                délka řetězce je nenulová
[ -z výraz ]             délka řetězce je nulová
[ výraz1 == výraz2 ]     řetězce jsou shodné
[ výraz1 != výraz2 ]     řetězce jsou různé
[ výraz1 -eq výraz2 ]    čísla jsou shodná (equals)
[ výraz1 -ne výraz2 ]    čísla jsou různá (not equal)
[ výraz1 -le výraz2 ]    výraz1 <= výraz2 (lees or equal)
[ výraz1 -lt výraz2 ]    výraz1 < výraz2 (less than)
[ výraz1 -ge výraz2 ]    výraz1 >= výraz2 (greater or equal)
[ výraz1 -gt výraz2 ]    výraz1 > výraz2 (greater than)

6. 💾 elif (cislo.sh)

#!/bin/bash

echo -n "Zadej celé číslo: "
read a

if [ $a -gt 100 ]
then
  echo "$a je větší než 100"
elif [ $a -lt 100 ]
then
  echo "$a je menší než 100"
else
  echo "$a je rovno 100"
fi

7. exit

exit n

Příkaz okamžité ukončí skript s daným návratovým kódem:

Ostatní n jsou rezervovány.

8. 💾 Cvičení: cislo2.sh ($?)

Vytvořte kopii skriptu cislo.sh s názvem cislo2.sh: Doplňte do něj návratové kódy takto:

Návratové kódy ověřte v terminálu příkazem:

$ echo $?

Proměnná $? obsahuje návratový status (kód) vykonaného programu. Návratové kódy neslouží ani tak uživateli, ale především systému nebo jinému skriptu.

9. AND, OR

Více podmínek se spojuje operátory && (AND) nebo || (OR).

Bash má odlišnou syntaxi:

if [ -r $nazev ] && [ -w $nazev ]

if [[ (podm_1 && podm_2) || (podm_3 && podm_4) ]]