[linux] BASH programovanie - ako zisti, ci je premenna "prazdna" // spravny zapis $premennej // prve slovo prveho riadku nezacinajuceho # zo $suboru // Ako script zisti svoju cestu?

Peter Trsko - dogmaT dogmat na inmail.sk
Neděle Duben 17 02:14:58 CEST 2005


Dobry den,

> Ahoj.
> 
> 1.
> 
> Potrebujem prve slovo prveho riadku nezacinajuceho # zo $suboru.
> 
> Zatial to robim takto (ale da mi to cely riadok ... nad suborom sa 
> nepozastavujte :)
> if [ -e /etc/hostname ];then pc=`grep -v "#" /etc/hostname | head 
> -1`;else pc="etc-hostname-neexistuje";fi
> if [ -z $pc ];then pc="hostname-was-empty";echo $pc;fi

ked uz tak uz :-)
if [ -e /etc/hostname ]; then
    # '^#' ak ma byt '#' teda na zaciatku riadku
    # su v tom subore aj prazdne riadky? ak hej tak by sa skor oplatilo
    # pouzit '(^#|^[ ]*)' a do hranatej zatvorky doplnit vsetky biele
    # znaky
    pc=`grep -v -E '^#' /etc/hostname | head -n1`

    # predpoklad: oddelovacom je medzera
    # ak sa pred prvym slovom nachadza medzer(a|y) - prec s nou!
    pc="${pc#* }"

    # odstrani vsetko, co nasleduje za prvym slovom
    # (tie hranate zatvorky su tam nutne)
    pc="${pc%%[ ]*}"
else
    pc="etc-hostname-neexistuje"
fi

este sa da ziskanie prveho slova aj pomocou:
   # (pc obsahuje prvy relevantny riadok)
   # za biele znaky sa povazuju vsetky
   for word in $pc; do
       pc=$word
       break
   done

odporucam este pozriet manual k awk-u, tu staci:
   # u awk-u pozor na ' a "
   pc=`grep -v -E '^#' /etc/hostname | head -n1  | awk '{ print $1 }'`

> 2. zmazane
> 
> 3. potrebujem
> if $daco = EMPTY (je prazdna) then $daco=$dacoine
> Odpovedam si sam :-D:
> if [ -z $daco ];then echo "empty";else echo "full";fi

je tu este aj:
  # ak je daco nenastavene, alebo prazdne
  # vrati retazec "dacoine", ale nenastavy daco=dacoine
  ${daco:-dacoine}
a
  # ak je daco nenastavene, alebo prazdne
  # vrati "dacoine" a aj nastavi daco=dacoine
  ${daco:=dacoine}
> 
> 4.
> Ktory zapis (bash) je spravny?
> name="$pc""_""$type""_""$dateback"
> name2="$pc"_"$type"_"${dateback}"
> name3="${pc}_${type}_${dateback}"
> name4=${pc}_${type}_${dateback}
> 
> Funguju sice vsetky, ale na co je najlepsie si navyknut (vzhladom na 
> python, perl, php, zsh, tcsh)?

odporucam name3

> 
> 5.
> Ako script zisti svoju cestu?
> Beziaci script /home/user/script/tento-script ...
> chcem dostat:
> $cesta=/home/user/script/

nazov skriptu je v $0 a aj s cestou
upozornenie: relativnou ak je volany napr ./script.sh alebo
../scripty/scritp.sh, ale ak je v adresari ktory je v $PATH a je volany
bez specifikacie cesty k nemu tak obsahuje absolutnu cestu

> 
> 5B.
> Ak by som aj vedel (neviem) zistit /home/user/script/tento-script
> ako ho "orezem" na:
> /home/user/script/tento-script

na ziskanie cisto cesty je tu viac moznosti:
  1. program "dirname"
      cesta=`dirname $0`
  2. ${0%/*}
      cesta="${0%/*}

obe moznosti robia to iste a to odstrania nazov scriptu z konca cesty


ak by si nahodou potreboval dostat potom nazov scriptu bez cesty tak:
  1. program "basename"
      script=`basename $0`
  2. ${0##*/}
      script="${0##*/}

> 
> 
> 
> Dik
> Peter
> 
> _______________________________________________
> http://lists.linux.sk/listinfo/linux
> Prehladavanie archivu: http://search.lists.linux.sk
> Meta FAQ: http://faq.lists.linux.sk

IMHO kukni "man bash"

Peter Trsko
-- 
(dogmaT
        (icq 303140614)
        (jabber `(dogmat na njs.netlab.cz
                  dogmat na jabber.sk))
        (web http://dogmat.tomi.us))




Další informace o konferenci linux