V shell skriptoch sú cykly a podmienky kľúčové pre automatizáciu úloh. Pomocou jednoduchých príkazov ako if-else
, for
, while
a until
môžete vytvoriť skripty, ktoré sa dokážu rozhodovať, vykonávať iterácie a spracovávať komplexné operácie bez manuálneho zásahu. V tomto článku sa pozrieme na syntax a využitie týchto konštrukcií, ako aj na to, kedy je najvhodnejšie použiť každú z nich.
Podmienky v shell skriptoch umožňujú vykonávať rôzne akcie na základe splnenia alebo nesplnenia určitých kritérií. Najbežnejším spôsobom, ako vytvoriť podmienky v shell skriptoch, je použitie príkazu if-else
.
Základná syntax pre if-else
vyzerá takto:
if [ podmienka ]; then
# vykonaj ak podmienka platí
else
# vykonaj ak podmienka neplatí
fi
Príklad, ktorý kontroluje, či súbor existuje, by vyzeral takto:
if [ -f "subor.txt" ]; then
echo "Súbor existuje"
else
echo "Súbor neexistuje"
fi
Podmienky môžu byť vnorené, čo znamená, že môžete vložiť ďalšie podmienky do blokov if
alebo else
. Napríklad:
if [ -f "subor.txt" ]; then
if [ -r "subor.txt" ]; then
echo "Súbor existuje a je čitateľný"
else
echo "Súbor existuje, ale nie je čitateľný"
fi
else
echo "Súbor neexistuje"
fi
Okrem klasického zápisu if-else
môžeme používať aj skrátené rozhodovacie konštrukcie, ako ternárny zápis, ktorý je kompaktný a veľmi užitočný pre jednoduché rozhodnutia v skriptoch.
Ternárny zápis je v shelli zvyčajne realizovaný pomocou príkazu test
alebo pomocou krátkeho zápisu v jednom riadku:
[ podmienka ] && príkaz_ak_platí || príkaz_ak_neplatí
Príklad:
[ -f "subor.txt" ] && echo "Súbor existuje" || echo "Súbor neexistuje"
Tento príkaz vykoná echo "Súbor existuje"
ak súbor existuje, inak vykoná echo "Súbor neexistuje"
.
Podobne môžeme využiť príkaz test
, ktorý je ekvivalentom príkazu [ ]
, pre jednoduché podmienky:
test -f "subor.txt" && echo "Súbor existuje" || echo "Súbor neexistuje"
Cyklus for
je najbežnejšie používaný pre iteráciu cez zoznam hodnôt, zatiaľ čo while
a until
sú vhodné na vykonávanie opakovaných operácií na základe podmienky.
Cyklus for
sa používa na iterovanie cez zoznam hodnôt alebo príkazov. Základná syntax vyzerá takto:
for i in zoznam; do
# vykonaj príkaz
done
Príklad:
for i in $(ls); do
echo "Súbor: $i"
done
Tento príkaz iteruje cez všetky súbory v aktuálnom adresári a vypíše ich názvy.
Cyklus while
sa vykonáva, pokiaľ platí daná podmienka. Tento cyklus je užitočný, ak neviete vopred, koľkokrát sa cyklus vykoná. Základná syntax:
while [ podmienka ]; do
# vykonaj príkaz
done
Príklad:
count=1
while [ $count -le 5 ]; do
echo "Počet: $count"
((count++))
done
Cyklus until
sa vykonáva, pokiaľ podmienka nie je splnená. Je to opak cyklu while
, pretože sa vykonáva, dokiaľ podmienka neplatí.
until [ podmienka ]; do
# vykonaj príkaz
done
Príklad:
count=1
until [ $count -gt 5 ]; do
echo "Počet: $count"
((count++))
done
V shelli je veľmi užitočné spracovávať výstupy príkazov ako vstupy do cyklov. Príkaz for i in $(ls)
je bežným spôsobom, ako iterovať cez zoznam súborov v adresári.
Príklad:
for i in $(ls /home/user); do
echo "Súbor: $i"
done
Výhodou použitia tohto typu cyklu je, že môžete vykonať operácie na každom súbore, ako je kopírovanie, zmena práv, alebo iné manipulácie.
Debugging je neoddeliteľnou súčasťou písania shell skriptov. Pri vytváraní a testovaní skriptov je veľmi užitočné zobraziť hodnoty premenných a sledovať, čo sa deje v každom kroku.
Príkaz echo
je veľmi užitočný na vypisovanie hodnôt premenných:
echo "Premenná i: $i"
Ďalším užitočným príkazom je set -e
, ktorý spôsobí, že skript sa zastaví pri prvej chybe. Toto je užitočné na zistenie presného miesta, kde skript zlyháva:
set -e
Pomocou týchto nástrojov môžete efektívne odhaliť problémy a upravit skripty tak, aby fungovali podľa očakávaní.
Ak sa chcete dozvedieť viac o cykloch, podmienkach a automatizácii úloh v shelli, navštívte náš Kurz shell – Programovanie v UNIX shelli pre systémových administrátorov, kde sa naučíte efektívne spravovať systémy pomocou shell skriptov.
Viac informacií preberáme na kurze: