V shell skriptech jsou cykly a podmínky klíčové pro automatizaci úkolů. Pomocí jednoduchých příkazů jako if-else
, for
, while
a until
můžete vytvořit skripty, které se dokážou rozhodovat, provádět iterace a zpracovávat složité operace bez manuálního zásahu. V tomto článku se podíváme na syntaxi a využití těchto konstrukcí, jak a kdy je nejlépe použít.
Podmínky v shell skriptech umožňují provádět různé akce na základě splnění nebo nesplnění určitých kritérií. Nejčastější způsob, jak vytvářet podmínky v shell skriptech, je použití příkazu if-else
.
Základní syntaxe pro if-else
vypadá takto:
if [ podmínka ]; then
# proveď pokud podmínka platí
else
# proveď pokud podmínka neplatí
fi
Příklad, který kontroluje, zda soubor existuje, vypadá takto:
if [ -f "soubor.txt" ]; then
echo "Soubor existuje"
else
echo "Soubor neexistuje"
fi
Podmínky mohou být také vnořeny, což znamená, že můžete vložit další podmínky do bloků if
nebo else
. Například:
if [ -f "soubor.txt" ]; then
if [ -r "soubor.txt" ]; then
echo "Soubor existuje a je čitelný"
else
echo "Soubor existuje, ale není čitelný"
fi
else
echo "Soubor neexistuje"
fi
Kromě klasického zápisu if-else
můžeme používat také zkrácené rozhodovací konstrukce, jako ternární zápis, který je kompaktní a velmi užitečný pro jednoduchá rozhodnutí v skriptech.
Ternární zápis je v shellu obvykle realizován pomocí příkazu test
nebo pomocí krátkého zápisu v jednom řádku:
[ podmínka ] && příkaz_ pokud_platí || příkaz_ pokud_neplatí
Příklad:
[ -f "soubor.txt" ] && echo "Soubor existuje" || echo "Soubor neexistuje"
Tento příkaz provede echo "Soubor existuje"
, pokud soubor existuje, jinak provede echo "Soubor neexistuje"
.
Stejně můžeme využít příkaz test
, který je ekvivalentem příkazu [ ]
, pro jednoduché podmínky:
test -f "soubor.txt" && echo "Soubor existuje" || echo "Soubor neexistuje"
Cyklus for
je nejběžněji používaný pro iterování přes seznam hodnot, zatímco while
a until
jsou vhodné pro provádění opakovaných operací na základě podmínky.
Cyklus for
se používá pro iterování přes seznam hodnot nebo příkazů. Základní syntaxe vypadá takto:
for i in seznam; do
# proveď příkaz
done
Příklad:
for i in $(ls); do
echo "Soubor: $i"
done
Tento příkaz iteruje přes všechny soubory v aktuálním adresáři a vypíše jejich názvy.
Cyklus while
se provádí, dokud platí daná podmínka. Tento cyklus je užitečný, pokud nevíte předem, kolikrát se cyklus provede. Základní syntaxe:
while [ podmínka ]; do
# proveď příkaz
done
Příklad:
count=1
while [ $count -le 5 ]; do
echo "Počet: $count"
((count++))
done
Cyklus until
se provádí, dokud podmínka není splněná. Je to opak cyklu while
, protože se provádí, dokud podmínka neplatí.
until [ podmínka ]; do
# proveď příkaz
done
Příklad:
count=1
until [ $count -gt 5 ]; do
echo "Počet: $count"
((count++))
done
V shellu je velmi užitečné zpracovávat výstupy příkazů jako vstupy pro cykly. Příkaz for i in $(ls)
je běžný způsob, jak iterovat přes seznam souborů v adresáři.
Příklad:
for i in $(ls /home/user); do
echo "Soubor: $i"
done
Výhodou použití tohoto typu cyklu je, že můžete provádět operace na každém souboru, jako je kopírování, změna práv, nebo jiné manipulace.
Debugging je nezbytnou součástí psaní shell skriptů. Při vytváření a testování skriptů je velmi užitečné zobrazit hodnoty proměnných a sledovat, co se děje v každém kroku.
Příkaz echo
je velmi užitečný pro vypisování hodnot proměnných:
echo "Proměnná i: $i"
Dalším užitečným příkazem je set -e
, který způsobí, že skript se zastaví při první chybě. Toto je užitečné pro zjistění přesného místa, kde skript selhal:
set -e
Pomocí těchto nástrojů můžete efektivně odhalit problémy a upravit skripty tak, aby fungovaly podle očekávání.
Pokud se chcete dozvědět více o cyklech, podmínkách a automatizaci úloh v shellu, navštivte náš Kurz SHELL – Programování v UNIX shellu pro systémové administrátory, kde se naučíte efektivně spravovat systémy pomocí shell skriptů.
Viac informacií preberáme na kurze: