Ako začať ?
|
|
chmod
+x skript.sh
|
Aby bol skript
spustiteľný, musí mať nastavený execute bit
|
#!/cesta/interpreter
|
Každý skript
musí začínať interpretorom, ktorý ho bude
vykonávať napr. #!/bin/sh |
echo
"text" >subor
|
presmerovanie
výstupu do súboru
|
prikaz
n> subor
|
presmeruje deskriptor n
na daný súbor
deskriptory:
stdin=0 standardní vstup (klávesnice)
stdout=1 std. výstup (obrazovka)
stderr=2 std. chybový výstup (obrazovka)
príklad: newfs
/dev/dsk/vg00 2>
súbor # presmerovanie chybového výstupu do
suboru
|
>&n
|
príkaz
>soubor 2>&1 # presmeruje vystup aj chybový
výstup do súboru
príkaz
2>&1 >soubor # presmeruje chybový
výstup na stdout a stdout do suboru
príklad: echo "text" >&2
# presmeruje stdout do stderr
|
<&n
|
vstup je
čítaný z descriptoru n
|
>>
|
append
echo "text"
>> soubor # presmeruje výstup do súboru,
neprepíše ho, ale pridá text na koniec súboru
|
<
|
presmerovanie vstupu
príkaz
< soubor # presmeruje stdin z klavesnice do suboru
|
<<token
|
presmerovanie vstupu,
číta zo skriptu alebo stdin až po token, ktorý
musí byť
samostatne na riadku
cat
>subor << END # akýkoľvek text, aj
$PREMENNÁ okrem ukončovacıeho riadku END
|
n<&-
|
zavrie vstup z
deskriptoru n
|
n>&-
|
zavrie výstup do
deskriptoru n
|
exit
[číslo]
|
ukončuje skript. Vracia
exit-code predchádzajúceho príkazu.
Vrátenú hodnotu je možné zobraziť pomocou
premennej $? Možné hodnoty 0=OK, <>0=chyba
|
exec
[príkaz]
|
nahradí kód
shellu príkazom tak, že prepíše jeho kód v
pamäti, nevytvára sa nový proces. Bez parametra
umožňuje presmerovanie vstupu/výstupu vo vnútri skriptu
|
Správa procesov
|
|
ps
|
výpis stavu
procesov
|
nohup
|
process sa
neukončí pri odhlaseni napr. nohup
skript.sh
|
kill
|
posiela signály
procesom
|
wait
|
čaká na dokončenie
potomka/potomkov skriptu
|
Subshell
|
|
(príkazy)
|
Subshell dedí
premenné prostredia, nededí lokálne
premenné (tj. tie, u ktorých nebol urobený export).
Zmeny premenných a ďalších nastaveni v
subshellu sa neprejeví v pôvodnom shelly!
|
{príkazy}
|
Rovnako ako
(príkazy), ale nespúšťa nový subshell
|
Použitie premenných
|
|
$PREMENNA
text
|
medzi
menom a ďalším textom musí býť oddelovací
znak
|
${PREMENNA}text
|
nie je nutný
ďaľší oddelovač
|
${PREMENNA:-hodnota}
|
ak premenná
existuje a nie je prázdna, použi jej obsah, inak použi "hodnota"
-> defaultna hodnota premennej. Ak sa nepoužije ":", testuje sa iba
existencia premennej a nie to, či má prázdny obsah
|
${PREMENNA:=hodnota}
|
ako
predchádzajúci prípad, avšak iba namiesto použitia
hodnoty nastaví premennú ne defaultnu hodnotu, ak bola
nedefinovaná. Ak sa nepoužije ":", testuje sa
iba existencia premennej a nie to, či má prázdny obsah
|
${PREMENNA:+hodnota} |
ak premenná
existuje a nie je prázdna, použi "hodnota", inak vráť
null. Ak sa nepoužije ":", testuje sa iba existencia
premennej a nie to, či má prázdny obsah
|
${PREMENNA:?sprava}
|
•
ak premenná existuje a je nenulová, použi jej hodnotu;
inak vypíš správu (správa môže byť aj
prázdna). Ak sa nepoužije ":", testuje sa iba
existencia premennej a nie to, či má prázdny obsah
echo ${NEEXIST1:?"Voľajako to
nie je ono"}
|
shift
<n>
|
posunie argumenty skriptu
doľava; posunie $1 <- $2 <- $3
|
readonly
[zoznam premenných]
|
označí
premenné len na čítanie. Subshell toto nastavenie
nededí
|
echo
|
zobrazí obsah
premennej
echo $PREMENNA, echo
${PREMENNA}text; echo text$PREMENNA;
|
unset
[premenna]
|
zruší nastavenie
premennej
|
read
[premenna]
|
načíta zo
štandardného vstupu (klávesnice) a uloží do
premennej
|
Hodnoty príkazov
|
príkazy
namiesto výpisu na stdout, môžu ukladať svoje hodnoty do
premenných
|
den=$(date
+%e)
|
premenna "den" bude
obsahovat aktualny den
|
den=`date
+%e`
|
premenna "den" bude
obsahovat aktualny den |
subory=$(ls
/etc)
|
premenna "subor" bude
obsahovat názvy súborov v adresári /etc
|
obsah=$(<
/etc/password)
|
premenna "obsah" bude
obsahovať obsah súboru /etc/password
|
Cykly
|
|
For
|
for premenna [ in
zoznam_vyrazov ];do zoznam_príkazov done
príklad: for i in *.txt ; do echo Soubor: $i done
príklad: for i in 1 2 3 4 5 6 7 8 9 10; do echo gzip
2006050$i.log done
|
Case
|
•
Poskytuje výber z viacerých volieb:
case vyraz in
volba1)
prikaz ;;
volba2|volba3|*.[ch])
prikaz
;;
....
*)
prikaz ;;
esac
|
While
|
while podmienka; do zoznam_prikazov done
príklad: while true ; do date; sleep 1 done
|
Until
|
until podmienka; do zoznam_prikazov
done
|
break
|
ukončenie cyklu
|
continue
|
pokračovanie cyklu
|
Testovanie podmienok
|
|
test [ podmienka
] |
príkaz
vyhodnotí zadanú podmienku a vráti nulovú
návratovú
hodnotu, pokiaľ je podmienka pravdivá, inak je
návratová hodnota
nenulová
príklad: while test $# -gt 0
príklad: while [ -n "$1" ]
príklad: if [ ! -r "$1" -o ! -f "$1" ]
|
-b
súbor
|
súbor existuje a
je blokovým špeciálnym súborom
|
-c
súbor
|
súbor existuje a
je znakovým špeciálnym súborom (charakter device)
|
-d
súbor
|
súbor existuje a
je to adresár
|
-f
súbor
|
súbor existuje
|
-g
súbor
|
súbor existuje a
má nastavený bit požičaných práv
skupín
|
-k
súbor
|
súbor existuje a
má nastavený "sticky" bit
|
-p
súbor
|
súbor existuje a
je to "named pipe"
|
-r
súbor
|
súbor existuje a
je ho možné čítať
|
-s
súbor
|
súbor existuje a
má nenulovú dĺžku
|
-t [n]
|
otvorený
descriptor súboru číslo n je spojený s
terminálom. Štandardný je descriptor č.1
|
-u
súbor
|
súbor existuje a
má nastavený bit požičaných práv
užívateľa
|
-w
súbor
|
súbor existuje a
je možne do neho zapisovať |
-x
súbor
|
súbor existuje je
spustiteľný
|
-G
súbor
|
súbor existuje a
jeho skupina je zhodná s efektívnouu procesu
|
-L
súbor
|
súbor existuje a
je to symbolický odkaz
|
-O
súbor
|
súbor existuje a
jeho vlastník je zhodný s efektívnym
vlastníkom procesu
|
-S
súbor
|
súbor existuje a
je to socket
|
súbor1
-ef súbor2
|
subor1 a subor2
reprezentujú rovnaký súbor
|
súbor1
-nt súbor2
|
subor1 je novší
ako subor2
|
súbor1
-ot súbor2 |
subor1 je starší
ako súbor2
|
-n
reťazec
|
retazec je nenulovej dĺžky
|
-z
reťazec
|
retazec je nulovej dĺžky
|
reťazec1
= reťazec2
|
reťazce sú
zhodné
|
reťazec1!=reťazec2
|
reťazce sa
navzájom nerovnajú
|
čislo1
-eq čislo2
|
|
čislo1
-ge čislo2
|
|
čislo1
-gt čislo2
|
|
|
|