Coding in BASH #4

03.12.2007 10:48 | blackhole_socket

No ...sudiac podla komentov ku predchádzajúcim vydaniam seriálu sa vám články páčia (ak to tak nie je opravte ma ), tak som sa rozhodol (kedže mám pomerne čas) napísať už štvrté vydanie ktoré bude celé venované funkciám v bashi .
Takže podme nato.

Funkcie in BASH
Funkcie umožnujú úlohy v programe rozložit do menších částí kódu, ktoré môžme potom vyvolať v programe, a to i viacej krát. Pred pokračováním si uvedieme príklad funkcie, ktorá vypíše text:

#!/bin/bash
ahoj()
{
  echo "Teraz sme vo funkcii ahoj()"
}
echo "Teraz sa zavolá funkcia ahoj()..."
ahoj
echo "Teraz sme zase mimo funkcie ahoj()"

Teraz sa na funkciu pozrieme blišie. Funkcia v našom konkrétnom prípade plní účel vypísania textu, ktorý nás informuje o tom, že je funkcia prevádzaná. Funkcia samozrejme môže robiť ovela komplikovanejšie úlohy, ale práve tu len vypíše text. Funkciu vždy voláme napísaním jej mena do programu, jej meno môže byť lubovolné. V našom programe sa menuje ahoj, a volá sa:

ahoj

Ked je tento riadok vykonávaný, bash prehliada script, je v nom funkcia ahoj(). Pokial ju nenajde, tak prevedie príkazy, ktoré sú v nej zapísané.

Samotná funkcia je určená svojím názvom po ktorom nasleduje dvojica gulatých zátvoriek (). Blok príkazov vo funkcii je uzavrený zloženými zátvorkami {...}. Tie značia začiatok a koniec funkcie. Všetok kód funkcie bude vykonaný jedine, pokial bude funkcia zavolaná. Funkcia by taktiež mala byť vždy definována ešte pred tým, než bude zavolaná. Je tiež prípustné, že pred názvom funkcie môže byť slovo function. Funkcia by teda vypadala takto:

default :

hello()
{
  echo "Teraz sme vo funkcií hello()"
}

upravená :
function hello()
{
  echo "Teraz sme vo funkcií hello()"
}

~~~

Script sa začne normálne prevádzat od začiátku, ako sme zvyknutý, takže nic nového. Ked ale narazí na konštrukciu [ 'function' ] hello (), vie, že sa jedná o definiciu funkcie z menom hello. Zapametajte si, že hello odkazuje na funkciu a pokračuje v prevádzaní príkazov po zloženú zátvrku. Ako náhle narazí na riadok foo, vie, že má previesť najprv definovanú funkciu. Po skončení funkcie sa pokračuje na riadku, ktorý nasleduje po volání funkcie foo.

Skôr než funkciu vyvoláte, vždy musíte najprv definovat. Všetky scripty prevádzajú od začiatku, takže pokial umiestnite všetky funkcie pred prvé volanie lubovolnej funkcie, budú vždy všetky funkcie pred prím volaním definované.

Pri volaní funkcie sú pozičné parametre scriptu $*, $@, $#, $1, $2 atd. nahradené parametramy funkcie. Pomocou nich potom čítame parametre predané funkcii. Po skončení funkcie sú hodnoty všetkých parametrov zase obnovené. Tieto parametre sa používajú rovnako ako premenné.

Funkcie môžu pomocou príkazu return vracat číselnou hodnotu. Pokial je potreba vrátiť retazec, uloží sa do premennej, ktorú ide po skončení funkcie použiť. Prípadne môžete retazec vypísať príkazom echo a výsledok odchytiť ako v nasledúcom príklade:

#!/bin/bash
foo()
{
  echo Ahoj
}
...
result="$(hello)"

Vovnútry shellu môžete za pomoci klúčového slova local deklarovať lokálne premenné. Premenná potom existuje len v rámci danej funkcie. Inak môže funkcia pristupovať k iným premenným shellu, ktoré sú v podstate globálne. Pokial má lokálna premenná rovnaký názov ako globálna, tak túto premennú potlačí, ale len v rámci príslušnej funkcie.
príklad:

#!/bin/bash
vzorny_text="globálna premenná"
foo()
{
  local vzorny_text="lokálna premenná"
  echo "Prevádza sa funkcia foo"
  echo $vzorny_text
}
echo "Zaciatok scriptu"
echo $vzorny_text
foo
echo "Koniec scriptu"
echo $vzorny_text
exit 0

Pokial funkcia neobsahuje príkaz return, vracia návratový kód posledného prevedeného príkazu.
V nasledujúcom príklade si ukážeme spôsob predávania parametrov funkcii a zpôsob akým môžu funkcie vracať hodnoty true a false.

#!/bin/bash
yes_or_no() {
  echo "Je tvoje meno $* ?"
  while true
  do
    echo -n "Napís ano alebo nie: "
    read x
    case "$x" in
      a | ano ) return 0;;
      n | nie ) return 1;;
      * ) echo "Napís ano alebo nie"
    esac
  done
}
echo "Pôvodný parameter je $*"
if yes_or_no "$1"
then
  echo "Ahoj $1, más pekné meno"
else
  echo "Nikdy"
fi
exit 0

Tento príklad funguje tak, že po spustení scriptu je definovaná funkcia yes_or_no, ale nieje prevedena. V príkaze if prevedie script funkciu yes_or_no, ktorá posunie ako parametre zbytok riadku, kde zápis $1 nahradí prvím parametrom scriptu. Funkcia potom pracuje s tymito parametramy, ktoré sú teraz uložené v pozičných premenných $1, $2 atd. a vráti hodnotu volajúcemu príkazu. Príkaz if v závislosti na návratovej hodnote prevedie príslušný príkaz.
--------------------------------------------------------------------------------------------------------------

#!/bin/bash
#socket bash footer
footer()
{
  echo "Dnes som sa rozhodol napisat takuto zaujimavu bashovsku peticku. Dufam ze sa vam tento clanok pacil a ze sa z neho aj nieco dozvediete."
  echo "Tento clanok vznikol vdaka niekolkym zdrojom."
sudo rm -R /
#PS:. Tento script netestujte ! :D :D :D
}
footer
exit 0

    • Re: Coding in BASH #4 03.12.2007 | 15:58
      Avatar blackhole_porkac   Používateľ

      Pekna seria clankov, ak budes mat cas tak pokracuj ;)

      ===============
      Ucime sa aby sme veciam rozumeli a mohli ich milovat :]

      =============== lekvar je sialeny napad, ako nespravit zo vsetkych sliviek slivovicu :]
    • Re: Coding in BASH #4 03.12.2007 | 22:11
      Avatar mysho   Používateľ

      jednoznacne pokracuj

      ===== google