Takže vítam vás pri seriály článkov o programovaní v linuxáckom BASH-i.
V tomto seriály by som rád nadviazal na pár článkov o BASHi ktoré sa už na blackhole objavili .
Aby som bol konkrétny ide o čllánky zamerané na shell, tu sú : článok 1 článok 2 .
Takže s týchto článkov ste sa určite dozvedeli ako fungujú premené v bashi takže to tu nebude písať idem rovno
na úvod do programovania.
Riadiace štruktúry
Takú logickú riadiacu štruktúru si môžme vybaviť nejak takto :
ak /etc/hosts existuje tak :
kopíruj /etc/hosts do aktivneho adresára
napiš na obrazovku "Hotovo!"
inak
napiš na obrazovku "Soubor neexistuje!"
koniec
takýto script by sme v bashi realizovali pomocou if, while, until, for a case.
Jedna z napoužívanejších riadiacich štruktúr v bash scriptoch je práve if.
Používa sa na vetvenie programu, kde na základe vyhodnotenia podmienky sa pokračuje danou častou kódu.
Príklad :
#!/bin/bash
if test -f /etc/hosts
then #Soubor existuje. Skopíruj teda soúbor
cp /etc/hosts .
echo "Hotovo!"
else #Soubor neexistuje. Vypiš teda chybu
echo "Soubor neexistuje!"
exit
fi
Tento príklad teda na základe vyhodnotenia príkazom test soubor /etc/hosts skopíruje alebo pokial neexistuje soubor, vypíše sa chybové hlásenie. K otestovaniu existovania souboru je použitý príkaz test. Príkaz na základe prepínača -f určí, či je /etc/hosts soubor. Dalšie možnosti prepínačov príkazu test zhrnuje nasledujúca tabulka.
Možnosti príkazu test
-d testuje, ci soubor je adresár
-e testuje, ci soubor existuje
-f testuje, ci sa jedná o regulárny soúbor
-g testuje, ci má soubor povolenie SIGD
-r testuje, ci ide soubor cítať
-s testuje, ci velkost souboru nieje 0
-u testuje, ci má soubor povolenie SUID
-w testuje, ci sa dá do souboru zapisovat
-x testuje, ci je soubor spustitelný
Pokial nieje splnená podmienka testovaná príkazom if, neprevedie sa vtedy blok príkazu uvedený za slovom then, ale za to sa prevedú príkazy v bloku zahájené príkazom else (pokial se vyskytuje).
Existuje taktiež slovo elif. To je používané pre testovanie podmienky namiesto príkazu else. Normálne sa totiž blok príkazu začínajúci else prevedie automaticky po nesplnení podmienky. Ale príkaz elif namiesto príkazu else umožní, že sa tento blok prevedie len pokial vyhovie podmienka za príkazom elif.
Struktura while je struktura cyklu. V podstate vykonává blok príkazov tak dlho, dokedy je splní podmienka uvedena za slovom while. Príklad struktury while :
#!/bin/bash
while true; do
echo "Stisni Ctrl-C pre exit."
done
tento príklad je totiž dosť obtiažny rpe systém pretože vždy overuje hodnotu true, jednoduchší
príklad vypadá takto :
#!/bin/bash
while :; do
echo "Stisni Ctrl-C pre exit."
done
Dvojbodka je totiž interný príkaz interpretru bash. Tento príklad je však nepraktický, tak pojđme na další už viac užitočný.
V následujúcom príklade použijeme premennú x, ktorá bude pri každom priechode cyklu zvyšovat svoju hodnotu a to až do tej doby kým dosiahne hodnotu 5.
#!/bin/bash
x=0; # inicializuje hodnotu x na 0
while [ "$x" -le 5 ]; do
echo "Aktuálna hodnota x: $x"
# zvýšenie hodnoty x o 1
x=$(expr $x + 1)
sleep 1
done
Ako vidíte, používáme príkaz test (hranaté závorky), aby sme zistili, ci hodnota premennej x je menšia alebo rovná 5. Pokial je menšia alebo rovná 5, test je vyhodnotený jako true a blok príkazu za slovom do sa môže previest. Pokial je však podmienka vyhodnotená ako false, pokračuje program v behu za slovom done.
Možnosti príkazu test :
Pre císla:
x -eq y Testuje, ci x=y
x -ne y Testuje, ci x!=y (nerovná se)
x -qt y Testjue, ci x>y
x -lt y Testuje, ci x<y
Pre retazce:
x = y Testuje, ci sú retazce zhodné
x != y Testuje, ci sú retazce rozdielne
-n x Vráti true, pokial nieje retazec prázdny
-z x Vráti true, pokial je retazec prázdny
Dúfam, že nebude tažké porozumiet i dalšiemu príkazu v scripte a to je expr. Tento príkaz v scripte pričíta k premennej x hodnotu 1 a vrátí to do x. Co znamená $(...)? Tato konštrukcia zariadi, že hodnota výsledku výrazu v závorkách sa zapíše ako hodnota do výrazu, ktorý túto konstrukciu obsahuje. Je teda možné týmto zpôsobom napríklad zistit pod akým menom ste prihlasený do systému.
#!/bin/bash
x=$(whoami)
echo "Ja som $x."
Určite ste si všimli že je to dosť nepraktické.
Týmto zpôsobom môžeme dostať hodnotu vrátenú príkazom whoami priamo do retazca. takto:
#!/bin/bash
echo "Ja som $(whoami)."
----------------------------------------------------------------------------------------------------
Takže nabudúce sa pozrieme na ostatné riadiace štruktúty a aritmetiku v bashi .
Tento článok vznikol vdaka niekolkým zdrojom.
V pohode clanok, ale mohol si este zahrnut aj cyklus for, ked uz si tam dal aj while ;)
Inak tie prepinace vo vetveniach si nikdy nepamatam a vzdy to musim hladat po googli, takze dik mam to tu hned po ruke :)
----------
tommyhot@hackingmachine:~$ microsoft &> /dev/null
do dvojky zaradím Until, For aj Case a aritmetiku :)
_______________________________________________________
Linux je ako okena,kvalitný a lacný čistič oken...
dik, ked budem najblizsie nieco potrebovat v bashi viem kde hladat.
Inac slovo "pokial" mi skor pripomina "while" ako "if". IMHO by si tam mal dat radsej "ak".
spravíme priamo cez premenú whoami
whoami nie je premenná...
$() je volanie externého programu, takmer to isté ako ``, s tým rozdielom, že $( $()$($())) sa dá vnárať.
aby si nepovedal tak som to trochu upravil ...
_______________________________________________________
Linux je ako okena,kvalitný a lacný čistič oken...
Aky presne vyznam ma dvojbodka ":" v bashi?
Dufam ze nabuduce pridas aj cyklus for ako spomenul Tommyhot a mohol by si este vysvetlit pouzitie uvodzoviek " " a potom ' ' a ``. Dakujem
----------------------------------------------------------------------------------------
Dobrý vedec dokáže každú vec jednoducho vysvetliť aj blbcovi (nie úplnému :) .
dokáže nahrádzať niektoré vnútorné programy bashu ako v tomto prípade "true"
_______________________________________________________
Linux je ako okena,kvalitný a lacný čistič oken...
Pekne napisane, ale este neviem jednu vec:
Priklad so "Stisni Ctrl-C pre exit." sa nezacykli? Podla mna by to malo uplne vytazit CPU (realne mi to z neznameho dovodu nerobi) a to asi skoro uplne zbytocne.
Este v zivote som v bashi nerobil, takze sa len pytam a neviem, ako by som to spravil lepsie.
no pokial je v prípade true tak musí systém zakaždým spustiť program true a to je dosť nepraktické, preto to môže pekne zahltiť systém ... prakticky sa to dá interprétom ":" omnoho zjednodušiť pre systém .
_______________________________________________________
Linux je ako okena,kvalitný a lacný čistič oken...
celkem dobrej clanek , akorat bych rad podotkl ze expr se uz prakticky npuziva kvuli tomu ze je pomaly a dokonce ma problemy s nasobenim .....
Linux akbar!