Coding in BASH #1

28.11.2007 20:05 | blackhole_socket

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.

    • Re: Coding in BASH #1 29.11.2007 | 00:27
      Avatar blackhole_tommyhot   Používateľ

      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

      • Re: Coding in BASH #1 29.11.2007 | 08:41
        Avatar blackhole_socket   Používateľ

        do dvojky zaradím Until, For aj Case a aritmetiku :)
        _______________________________________________________
        Linux je ako okena,kvalitný a lacný čistič oken...

    • Re: Coding in BASH #1 29.11.2007 | 01:39
      Avatar vid   Používateľ

      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".

    • Re: Coding in BASH #1 29.11.2007 | 09:36
      Avatar blackhole_matej   Používateľ

      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ť.

      • Re: Coding in BASH #1 29.11.2007 | 12:28
        Avatar blackhole_socket   Používateľ

        aby si nepovedal tak som to trochu upravil ...
        _______________________________________________________
        Linux je ako okena,kvalitný a lacný čistič oken...

    • Re: Coding in BASH #1 29.11.2007 | 13:36
      Dusin   Návštevník

      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 :) .

      • Re: Coding in BASH #1 29.11.2007 | 19:37
        Avatar blackhole_socket   Používateľ

        dokáže nahrádzať niektoré vnútorné programy bashu ako v tomto prípade "true"
        _______________________________________________________
        Linux je ako okena,kvalitný a lacný čistič oken...

    • Re: Coding in BASH #1 29.11.2007 | 18:21
      qaws   Návštevník

      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.

      • Re: Coding in BASH #1 29.11.2007 | 19:26
        Avatar blackhole_socket   Používateľ

        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...

    • Re: Coding in BASH #1 29.11.2007 | 18:58
      Avatar Alexej   Používateľ

      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!

      ---- -_ _-_- _-_ _ ---- - -__- -_-- -_ _- - _