Shell script II.

Prikaz Popis
true vrati vzdy uspesny navratovy kod
false vrati vzdy neuspesny navratovy kod
test expr vyhodnoti expr a vrati uspesny navratovy kod, ak je expr nenula (true). Pouziva sa zvycajne ako test podmienok pre if, while, ...
Jednotlive symboly v expr su zlozene z parametrov a mozu byt napriklad:
integer -eq integer rovnost
integer -ne integer nerovnost
integer -gt integer vacsi
integer -lt integer mensi
integer -ge integer vacsi alebo rovny
integer -le integer mensi alebo rovny
string = string rovnost retazcov
string != string nerovnost retazcov
-f file subor existuje a je regularny subor
-s file subor existuje a ma nenulovu dlzku
-d file subor existuje a je adresar
( expr ) zatvorkovanie podvyrazu
! expr negacia podvyrazu
expr1 -a expr2 logicke a sucasne
expr1 -o expr2 logicke alebo




Specialne prikazy shellu

Prikaz Popis Priklad
if
prikazy
then
prikazy
<elif
prikazy
then
prikazy>*
else
prikazy
fi
Podmienene vykonavanie prikazov if test $X = 1
then echo 1
else echo 2
fi
for premenna in retazce do prikazy done Cyklus; vykonavanie prikazov prikazy pre kazdy z retazcov retazce, aktualne hodnota bude v premennej premenna for f in a b
do
echo ${f}
done
for premenna in shellexpr do prikazy done Cyklus; vykonavanie prikazov prikazy pre kazde meno suboru matchujuce shell expanziu shellexpr, aktualne hodnota bude v premennej premenna for f in *.c
do
echo ${f}
done
while prikazy1 do prikazy2 done Cyklus, pokial posledny z prikazov prikazy1 skonci uspesne vykonavaj prikazy2 while test $X -gt 0
do
echo tutu
done
case retazec in <shellexpr1>) prikazy1;; <shellexpr2>) prikazy2;; ... <shellexprn>) prikazyn;; esac rozvetvenie podla pripadov. Testuje retazec retazec na matching proti shellexpr, vyberie zhodujuci sa pripad a vykona zodpovedajuce prikazy case toto in
to*)
echo to*
;;
tutu)
echo tutu
;;
esac
function meno() { prikazy } Definovanie "funkcie", ktoru mozno vyvolat menom. K parametrom funkcie mozno pristupovat cez premenne $1, $2, ... $n. function ahoj() {
echo "ahoj funkcia"
}
break Ukonci prave prebiehajuci cyklus, pokracuj za jeho koncom  
continue Ukonci prave prebiehajucu iteraciu cyklu, pokracuj dalsou iteraciou.  
# cokolvek Poznamka. Za # moze byt akykolvek retazec.  




Priklady




1.) Shell script nasobic, ktory vypise vsetky svoje ciselne parametre prenasobene dvomi:

 for n in $*
 do
   echo `expr 2 \* ${n}`
 done
Priklad pouzitia:
~/tmp/scripts>sh nasobic 2 3 4 5
4
6
8
10



2.) Shell script naozaj, ktory si vyziada potvrdenie pred prevedenim akcie.

 echo "Naozaj to chces urobit?"
 read a
 if test "${a}" = "y" -o "${a}" = "Y"
 then
    echo "Tak dobre, ako chces."
 else
    echo "Zbabelec."
 fi
Priklad pouzitia:
~/tmp/scripts>sh naozaj
Naozaj to chces urobit?
n
Zbabelec.
~/tmp/scripts>sh naozaj
Naozaj to chces urobit?
Y
Tak dobre, ako chces.



3.) Shell script prepis, ktory vypise subor riadok po riadku

 n=1
 cp $1 /tmp/toto
 while 
    test -s /tmp/toto
 do
    xx=`head -1 /tmp/toto`
    echo ${n}: ${xx}
    tail +2 /tmp/toto > /tmp/toto2
    mv /tmp/toto2 /tmp/toto
    n=`expr ${n} + 1`
 done
Priklad pouzitia:
~/tmp/scripts>sh prepis prepis
1: n=1
2: cp $1 /tmp/toto
3: while
4: test -s /tmp/toto
5: do
6: xx=`head -1 /tmp/toto`
7: echo ${n}: ${xx}
8: tail +2 /tmp/toto > /tmp/toto2
9: mv /tmp/toto2 /tmp/toto
10: n=`expr ${n} + 1`
11: done



4.) Ina verzia shell scriptu prepis

n=1
cat $1 | while read xx
do
  echo ${n}: ${xx}
  n=`expr ${n} + 1`
done
Nevyhodou konstrukcie "... | while read x" kde sa standardny vstup presmerovava do cyklu je, ze telo cyklu sa v tomto pripade vykonava novou instanciou shellu a teda hodnota premennych nadstavenych vo vnutri cyklu sa neprenasa von z cyklu.









Cvicenia





1.) Napiste shell script "faktorial.sh", ktory dostane ako parameter cislo a vypocita jeho faktorial.


2.) Napiste shell script autoshift.sh, ktory bude 'incrementovat' mena vsetkych suborov s menom 'auto-shift-xxx', kde xxx je lubovolne trojciferne cislo. Po zbehnuti tohto shell scriptu sa obsah suboru 'auto-shift-xxx' bude nachadzat v subore 'auto-shift-yyy', kde yyy sa rovna xxx plus jedna. T.j. napriklad, ak mam v pracovnom adresari subory 'auto-shift-001' a 'auto-shift-002', tak po zbehnuti tohto shell scriptu budem mat subory 'auto-shift-002' a 'auto-shift-003', pricom novy subor 'auto-shift-003' bude obsahovat to, co povodne obsahoval subor 'auto-shift-002' a 'auto-shift-002' bude obsahovat to, co povodne obsahoval subor 'auto-shift-001' (a subor auto-shift-001 sa zmaze).