Coding in BASH #3

02.12.2007 11:41 | blackhole_socket

Vitajte už pri tretom pokračovaní článkov o programovaní v BASHi.
Dnes by som rád prebral funkciu rôznych uvodzoviek v bashi a používanie argumentov tohto silného jazyka.

Uvodzovky v BASHi

V bashi môžeme písať tri rôzne typy uvodzoviek, z nich každé majú iný význam. A to sú : dvojité uvozovky: ", predná uvodzovka: ' a zadná uvodzovka: `.
Dvojitá uvodzovka sa používa hlavne k určeniu niekolkých slov oddelenými mezerami ako jeden retazec. Teda slová v dvojitých uvozovkách sa považujú vždy za jeden parameter, a to ako jeden retazec.
príklad:

gentoo linux # mkdir hello socket
gentoo linux # ls -F
hello/    socket/

Uvidíme to, co po použití príkazu ls -F vidíme. To jest vytvorené dva samostatné adresáre. Ale pokial použijeme následne ako parameter "hello world", uvidíme toto:

gentoo linux # mkdir "hello socket"
gentoo linux # ls -F
hello socket/

Vidíme tu, že pokial chceme vytvoriť adresár, ktorý obsahuje dve a viac slov oddelenými mezerami, musíme tento názov uviesť v dvojitých uvozovkách, inak sa nám vytvorí adresárov niekolko, z nich každý bude mať názov ako jedno zo slov uvedeného ako parameter príkazu mkdir.

Predné uvodzovky taktiež uzatvárajú retazec podobne ako dvojité uvozovky, ale je tu jeden rozdiel. Retazec uzatvárajúci predné uvodzovky bude zobrazený presne tak, ako je zadaný.
príklad:

#!/bin/bash
x=10
echo "Hodnota premennej x je $x"
echo 'Hodnota premennej x je $x'

výsledok bude takýto :

Hodnota premennej x je 10
Hodnota premennej x je $x

Je z toho vidieť, že pri použití dvojitých uvozoviek sa prevedie nahrazení $x za konkrétnu hodnotu, pokial je ale výraz uzavrený do predných uvodzoviek (apostrof), k tomuto nahradeniu nedojde.

Posledný typ uvodzoviek (zadné uvodzovky) sa používa namiesto tejto konštrukcie:

x=$(expr $x + 5)

Ako vidíte x je priradená hodnota o 5 vetšia než bola hodnota x pred prevedením. Premenná x sa teda inkrementovala. Zápis ide taktiež previesť pomocou uvodzoviek:

x=`expr $x + 5`

Nieekdy sa toto môže hodiť. Napríklad :

echo "Ja som `whoami`."

Argumenty

Argumenty sú uložené v premenných. Premenná $# uchovává počet argumentov predaných programu. Jednotlivé argumenty sú uložené v premenných $0, $1, $2,... Je tu vidiet, že sú uloženy v premenných číslovaných od 0 do počtu parametov, pričom v premennej $0 je uložený názov programu. Argumenty programu predané su až v premenných 1 a viac. Parametrov môže byť celkom 9. teraz bude nasledovať príklad, v ktorom sa parametre využijú:

#!/bin/bash
if [ "$#" -ne 1 ]; then
  echo "Použitý: $0 argument."
fi
echo "Prvý a jediný argument predaný scriptu je $1"

Tento program očakává iba jeden parameter, aby sa spustil program. Pokial bolo predaných viac alebo menej než jeden parameter, vypíše správu použitia. Pokial bol jeden argument predaný, bude taktiež vypísaný.

Pokial budete chciet pristupiť ku všetkým parametrom scriptu ako k jedinej premennej, použijete ku čítaniu parametrov premennú $*. Tá vráti zoznam všetkých parametrov uložených v jednej premennej a oddelených prvím znakom uvedeným v premennej IFS. Pokial však použijete pre prístup premennú $@, vráti vám toisté co $*, ale nepoužívá premennou prostredia IFS. Presný rozdiel medzi $* a $@ špecifikuje X/Open.

tabulka prememných :

                                          Niektoré premenné prostredia
$HOME  -------------  Domovský adresár aktuálneho užívatela
$PATH  -------------  Zoznam adresárov oddelený dvojbodkami, v ktorých se majú hladat príkazy
$PS1  -------------  Prompt príkazoveho riadku, obvykle $
$PS2  -------------  Druhý prompt, ktorý se využíva pri dodatočnom vstupe, obvykle >
$IFS  -------------  Oddelovac polí. Zoznam znakov, ktoré slúžia k oddelovániu slov, ked shell cíta vstup, obvykle                        medzera, tabulátor a znak nový riadok
$0  -------------  Názov scriptu
$#  -------------  Pocet predaných parametrov
$$  -------------  ID procesu scriptu, ktoré sa casto používa vovnútry shellu ku generovaniu jedinecných názvou docasných súborov

------------------------------------------------------------------------------------------
Nabudúce (ak nejaké bude) by som rád ukázal ako fungujú funkcie scriptov a nejaké návratové hodnoty.
Tento článok vznikol vdaka niekoľkým zdrojom.

    • Re: Coding in BASH #3 02.12.2007 | 12:46
      Avatar mysho   Používateľ

      SOCKET ides. pis dalej a dalej. sice som nemal cas to vsetko citat ale urcite si ho najdem. tak pis

      ===== google
      • Re: Coding in BASH #3 02.12.2007 | 15:20
        Avatar blackhole_socket   Používateľ

        wtf? načo narážaš ?

        _______________________________________________________
        Gentoo READY ! ...

        • Re: Coding in BASH #3 02.12.2007 | 15:32
          Avatar blackhole_tommyhot   Používateľ

          Asi na to ze pises kvalitne clanky, ktore sa aj zidu ;)
          ----------
          tommyhot@hackingmachine:~$ microsoft &> /dev/null

          • Re: Coding in BASH #3 29.06.2009 | 14:22
            W1cK3d   Návštevník

            presne

            _________________________________________________________________________________
            konecne som si precital Hacking-art of exploitation od Jona Ericksona...je to borec ;)

    • Re: Coding in BASH #3 02.12.2007 | 20:07
      Dusin   Návštevník

      Este si dovolim doplnit par premennych skriptu:
      "$@" vypise vsetky argumetny(parametre) ako samostatne retazce
      "$*" vypise vsetky argumetny ale ako jeden retazec

      A toto sa da pouzit univerzalne aj mimo skriptu len v prikazovom riadku:
      $? vypise exit kod posledneho uzavreteho programu, ked nam skonci nejaky proces tak tymto mozeme zistit ci bol jeho navratovy kod 0 a teda skoncil bez chyby ale zahlasil chybu a vratil nenulovy exitcode.
      $! PID posledneho procesu
      echo $0 mimo skriptu vypise nazov shelu napr.: -bash

      ----------------------------------------------------------------------------------------------------
      Dobrý vedec dokáže každú vec jednoducho vysvetliť aj blbcovi (nie úplnému :) .

    • Re: Coding in BASH #3 03.12.2007 | 08:53
      chrasta   Návštevník

      dobry clanok. to be continued .... ???