Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Speciální podmínkové příkazy
25. července 2002, 00.00 | V minulém dílu našeho seriálu o využití příkazového řádku jsme se seznámili s příkazem if. Řekli jsme si také, že podmínkou, určující kterou z "větví" then či else shell provede a kterou přeskočí, je seznam — příkaz nebo řada příkazů, jejichž návratová hodnota je určující.
Speciální podmínkové příkazyV minulém dílu našeho seriálu o využití příkazového řádku jsme se seznámili s příkazem if. Řekli jsme si také, že podmínkou, určující kterou z "větví" then či else shell provede a kterou přeskočí, je seznam — příkaz nebo řada příkazů, jejichž návratová hodnota je určující.
V praxi ovšem poměrně často potřebujeme jednoduché podmínky typu "je v proměnné X hodnota 1"? "Byl skript volán s nějakým vstupním parametrem"? "Existuje soubor Y"?
Namísto toho, aby shelly nabízely množství jednoúčelových triviálních prográmků, jež by tyto podmínky ověřovaly, máme k dispozici speciální podmínkový příkaz, který může v příkazu if stát na místě seznamu. Tento příkaz má obecný tvar
[[ podmínka ]]
a nabízí přebohatou sadu nejrůznějších podmínek; my se seznámíme jen s těmi nejzákladnějšími.
Porovnávání textových řetězců
Pro práci s řetězcovými hodnotami slouží jednoduché podmínky, jež připomínají programovací jazyk C: podmínka == ověří, jsou-li řetězce totožné; podmínka != ověří, zda se řetězce liší. Navíc je k dispozici jednoduchý unární operátor -z, který platí je-li jeho argument prázdný:
80 /tmp> X=blah
81 /tmp> Y=
82 /tmp> if [[ $X == "blah" ]] then echo Jojo ; fi
Jojo
83 /tmp> if [[ $X != $Y ]] then echo Lisi se ; fi
Lisi se
84 /tmp> if [[ -z $X ]] then echo Nic tam neni ; fi
85 /tmp> if [[ -z $Y ]] then echo Nic tam neni ; fi
Nic tam neni
86 /tmp>
Operátor -z se nejčastěji využívá ve skriptech pro kontrolu, zda byly zadány nějaké argumenty:
86 /tmp> cat > test
#!/bin/zsh
if [[ -z $1 ]] then
echo Tento skript je treba volat s argumentem XYZ...
else
echo Vlastni obsah skriptu, XYZ je $1...
fi
87 /tmp> chmod a+x test
88 /tmp> ./test
Tento skript je treba volat s argumentem XYZ...
89 /tmp> ./test HUH
Vlastni obsah skriptu, XYZ je HUH...
90 /tmp>
Porovnávání numerických výrazů
Operátory -eq (ekvivalence), -ne (liší se), -lt (menší /less than/), -gt (větší /greater than/), -le (menší nebo rovno /less or equal/) a -ge (větší nebo rovno) interpretují své argumenty jako číselné výrazy:
93 /tmp> if [[ 1 == 001 ]] then echo Jojo ; else echo Nene ; fi
Nene
94 /tmp> if [[ 1 -eq 001 ]] then echo Jojo ; else echo Nene ; fi
Jojo
95 /tmp>
a tedy samozřejmě dovolují práci s aritmetickými výrazy (které už známe):
96 /tmp> if [[ 2+3*4 -eq 14 ]] then echo Precedence operatoru je v poradku ; fi
Precedence operatoru je v poradku
97 /tmp>
Složené výrazy
Podmínky můžeme kombinovat do složitějších výrazů pomocí stejného aparátu, který dobře znají programátoři v jazyce C: máme k dispozici unární operátor ! pro negaci a binární operátory && a || pro konjunkci a disjunkci. Samozřejmě, že libovolnou podmínku můžeme uzavřít do závorek:
116 /tmp> cat test
#!/bin/zsh
if [[ $1 -lt 10 || $1 -gt 20 ]] then
echo "Argument musi byt z intervalu <10,20>"
else
echo "Vlastni obsah skriptu ($1)"
fi
117 /tmp> ./test
Argument musi byt z intervalu <10,20>
118 /tmp> ./test 5
Argument musi byt z intervalu <10,20>
119 /tmp> ./test 21
Argument musi byt z intervalu <10,20>
120 /tmp> ./test 17
Vlastni obsah skriptu (17)
121 /tmp>
Příště...
...si ukážeme speciální podmínky pro práci se soubory.
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová