Erinevus lehekülje "Bash" redaktsioonide vahel
11. rida: | 11. rida: | ||
Näiteks toome skpriti, mis kirjutab ekraanile "Näe, poolkuu". | Näiteks toome skpriti, mis kirjutab ekraanile "Näe, poolkuu". | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
echo "Näe, poolkuu" | echo "Näe, poolkuu" | ||
− | + | </source> | |
Selgituseks märgime, et | Selgituseks märgime, et | ||
40. rida: | 41. rida: | ||
Muutujale väärtuse omistamisel märgitakse teda vaid nimega (a_1), kuid talle viidates peab alustama muutuja nime dollar ($a_1). Näites omistatakse võrdusmärgi abil muutujale väärtus ja kasutatakse seda | Muutujale väärtuse omistamisel märgitakse teda vaid nimega (a_1), kuid talle viidates peab alustama muutuja nime dollar ($a_1). Näites omistatakse võrdusmärgi abil muutujale väärtus ja kasutatakse seda | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a_1=5 | a_1=5 | ||
47. rida: | 49. rida: | ||
echo $b_1 | echo $b_1 | ||
echo $c_1 | echo $c_1 | ||
+ | </source> | ||
Tühikute olemasolu ja puudumine on oluline. | Tühikute olemasolu ja puudumine on oluline. | ||
57. rida: | 60. rida: | ||
Kui on tarvis, et keskkonnamuutujad asenduksid oma väärtustega ning toimuks muutuja väärtustamine, siis kasutatakse jutumärke, näiteks | Kui on tarvis, et keskkonnamuutujad asenduksid oma väärtustega ning toimuks muutuja väärtustamine, siis kasutatakse jutumärke, näiteks | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
echo "Keskkonnamuutujate asemele tekivad nende väärtused: $OSTYPE" | echo "Keskkonnamuutujate asemele tekivad nende väärtused: $OSTYPE" | ||
62. rida: | 66. rida: | ||
echo "Käsud väärtustatakse: `date`" | echo "Käsud väärtustatakse: `date`" | ||
echo "Aritmeetiline väärtustamine: 11 + 11 = $((11+11))" | echo "Aritmeetiline väärtustamine: 11 + 11 = $((11+11))" | ||
+ | </source> | ||
===Aritmeetilised tehted=== | ===Aritmeetilised tehted=== | ||
71. rida: | 76. rida: | ||
* "<<, >>" - bitinihe | * "<<, >>" - bitinihe | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a=255 | a=255 | ||
82. rida: | 88. rida: | ||
echo "$a % $d = $a_jaak_d" | echo "$a % $d = $a_jaak_d" | ||
echo "$a >> $b = $a_bitinihe_paremale_b" | echo "$a >> $b = $a_bitinihe_paremale_b" | ||
+ | </source> | ||
===Tingimused ja valikulause=== | ===Tingimused ja valikulause=== | ||
106. rida: | 113. rida: | ||
Skript genereerib juhusliku arvu vahemikus 0 kuni 32 767 (2^15) ja teatab, milline see on | Skript genereerib juhusliku arvu vahemikus 0 kuni 32 767 (2^15) ja teatab, milline see on | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a=$RANDOM | a=$RANDOM | ||
115. rida: | 123. rida: | ||
echo "Juhuslik arv on 20 000 <= $a < 32767" | echo "Juhuslik arv on 20 000 <= $a < 32767" | ||
fi | fi | ||
+ | </source> | ||
Näites esitatakse tingimused, kusjuures | Näites esitatakse tingimused, kusjuures | ||
130. rida: | 139. rida: | ||
Kantsulgude asemel võib tingimuse esitamisel kasutada suvalist programmi. Sel juhul tõlgendatakse programmi lõppkoodi väärtust tõeväärtusena, so 0 on tõene ja muu väär. Näites saadab õppejõud igale praktikumist puudujale kirja, milles ta vabandab, et viib õppetööd läbi ilma tegelase osavõtuta | Kantsulgude asemel võib tingimuse esitamisel kasutada suvalist programmi. Sel juhul tõlgendatakse programmi lõppkoodi väärtust tõeväärtusena, so 0 on tõene ja muu väär. Näites saadab õppejõud igale praktikumist puudujale kirja, milles ta vabandab, et viib õppetööd läbi ilma tegelase osavõtuta | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
for i in priit miima peeter mart liibu | for i in priit miima peeter mart liibu | ||
138. rida: | 148. rida: | ||
fi | fi | ||
done | done | ||
+ | </source> | ||
Nagu ikka, peab rida jätkav kaigas olema viimane sümbol real. | Nagu ikka, peab rida jätkav kaigas olema viimane sümbol real. | ||
143. rida: | 154. rida: | ||
Tihti kasutatakse tingimuste esitamisel spetsiaalset sisekäsku test. Esitame näite selle käsu kasutamisest | Tihti kasutatakse tingimuste esitamisel spetsiaalset sisekäsku test. Esitame näite selle käsu kasutamisest | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a=$RANDOM | a=$RANDOM | ||
152. rida: | 164. rida: | ||
echo "Juhuslik arv on 20 000 <= $a < 32767" | echo "Juhuslik arv on 20 000 <= $a < 32767" | ||
fi | fi | ||
+ | </source> | ||
If-else tingimust saab esitada ka && (AND) ja || (OR) abil | If-else tingimust saab esitada ka && (AND) ja || (OR) abil | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a=$RANDOM | a=$RANDOM | ||
(test $a -lt 15000 && echo "$a < 15 000" ) || echo "$a >= 15 000" | (test $a -lt 15000 && echo "$a < 15 000" ) || echo "$a >= 15 000" | ||
− | + | </source> | |
+ | |||
&& -le järgnev käsk täidetakse, kui eelnenud käsu lõppkood oli null (tõene). | && -le järgnev käsk täidetakse, kui eelnenud käsu lõppkood oli null (tõene). | ||
|| -le järgnev käsk täidetakse, kui eelnenud käsu lõppkood oli üks (väär). | || -le järgnev käsk täidetakse, kui eelnenud käsu lõppkood oli üks (väär). | ||
164. rida: | 179. rida: | ||
Loogiliste tehetega mängimiseks on otstarbekas kasutada spetsiaalseid programme true ja false, mis ei tee muud, kui tagastavad vastava lõppkoodi | Loogiliste tehetega mängimiseks on otstarbekas kasutada spetsiaalseid programme true ja false, mis ei tee muud, kui tagastavad vastava lõppkoodi | ||
+ | <source lang=bash> | ||
bash~$ (true && echo "õige" ) || echo "väär" | bash~$ (true && echo "õige" ) || echo "väär" | ||
õige | õige | ||
bash~$ (false && echo "õige" ) || echo "väär" | bash~$ (false && echo "õige" ) || echo "väär" | ||
väär | väär | ||
+ | </source> | ||
Tavaline on skriptides kontrollida mingite muutujate seadistust, näiteks kontrollime kas ssl kataloog on seadistatud | Tavaline on skriptides kontrollida mingite muutujate seadistust, näiteks kontrollime kas ssl kataloog on seadistatud | ||
+ | <source lang=bash> | ||
if [ "$MOD_SSL_DIR" = "" ] | if [ "$MOD_SSL_DIR" = "" ] | ||
then | then | ||
176. rida: | 194. rida: | ||
exit 1 | exit 1 | ||
fi | fi | ||
+ | </source> | ||
Leksikograafilisi tingimusi esitatakse järgmiste loogiliste operaatorite abil | Leksikograafilisi tingimusi esitatakse järgmiste loogiliste operaatorite abil | ||
184. rida: | 203. rida: | ||
Esitame näite, kus skript ootab vastust küsimusele, "Kes on Kuutõrvaja üks peategelaskujusid?" | Esitame näite, kus skript ootab vastust küsimusele, "Kes on Kuutõrvaja üks peategelaskujusid?" | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
echo "Kes on Kuutõrvaja üks peategelaskujusid?\n" | echo "Kes on Kuutõrvaja üks peategelaskujusid?\n" | ||
192. rida: | 212. rida: | ||
echo "Vale" | echo "Vale" | ||
fi | fi | ||
+ | </source> | ||
Rida 'read vastus' ootab klaviatuurilt sisestust ning omistab selle muutuja $vastus väärtuseks. | Rida 'read vastus' ootab klaviatuurilt sisestust ning omistab selle muutuja $vastus väärtuseks. | ||
199. rida: | 220. rida: | ||
Case valik võimaldab valida mitme tegevuse vahel. Näide teatab, kas sisestatud sõna algustäht oli vahemikust A-K, L-Z või midagi muud | Case valik võimaldab valida mitme tegevuse vahel. Näide teatab, kas sisestatud sõna algustäht oli vahemikust A-K, L-Z või midagi muud | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
echo "Sisestage klaviatuurilt sõna:" | echo "Sisestage klaviatuurilt sõna:" | ||
207. rida: | 229. rida: | ||
*) echo "Midagi muud";; | *) echo "Midagi muud";; | ||
esac | esac | ||
+ | </source> | ||
Valikut määrav regulaaravaldise stiilis avaldis [a-k]*|[A-K]* tähendab, et klapivad stringid, mis algavad väikese vahemikku a kuni k jääva tähega või samasse vahemikku jääva suure tähega. | Valikut määrav regulaaravaldise stiilis avaldis [a-k]*|[A-K]* tähendab, et klapivad stringid, mis algavad väikese vahemikku a kuni k jääva tähega või samasse vahemikku jääva suure tähega. | ||
214. rida: | 237. rida: | ||
See on väga sarnane Case valikule olles interaktiivsem | See on väga sarnane Case valikule olles interaktiivsem | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
select i in "Tartu" "Valga" "Paide" "Ahja" "Ots" | select i in "Tartu" "Valga" "Paide" "Ahja" "Ots" | ||
226. rida: | 250. rida: | ||
esac | esac | ||
done | done | ||
+ | </source> | ||
===Korduslaused=== | ===Korduslaused=== | ||
235. rida: | 260. rida: | ||
For korduses seatakse tavaliselt otseselt paika korduste arv. Toome näite | For korduses seatakse tavaliselt otseselt paika korduste arv. Toome näite | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a="Tartu Elva Puhja Polva" | a="Tartu Elva Puhja Polva" | ||
241. rida: | 267. rida: | ||
echo $i | echo $i | ||
done | done | ||
+ | </source> | ||
Iga järgmise kordusega omandab muutuja $i uue väärtuse nimekirjast, milleks on muutuja $a tühikuga eraldatud alamstringid. Muutujale $a võib väärtust omistada ka kasutades käsu väärtustamist, näiteks jätame muutuja $a enda kasutamata | Iga järgmise kordusega omandab muutuja $i uue väärtuse nimekirjast, milleks on muutuja $a tühikuga eraldatud alamstringid. Muutujale $a võib väärtust omistada ka kasutades käsu väärtustamist, näiteks jätame muutuja $a enda kasutamata | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
for i in `ls r*` | for i in `ls r*` | ||
249. rida: | 277. rida: | ||
echo $i | echo $i | ||
done | done | ||
+ | </source> | ||
Näites kuvatakse kõik r tähega algavad failinimed. | Näites kuvatakse kõik r tähega algavad failinimed. | ||
256. rida: | 285. rida: | ||
While kordust korratakse kuni tingimus on tõene. Näites sooritatakse kordus kuni muutuja $a on väiksem kümnest | While kordust korratakse kuni tingimus on tõene. Näites sooritatakse kordus kuni muutuja $a on väiksem kümnest | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a=0 | a=0 | ||
263. rida: | 293. rida: | ||
a=$(($a+1)) | a=$(($a+1)) | ||
done | done | ||
+ | </source> | ||
====Until korduslause==== | ====Until korduslause==== | ||
268. rida: | 299. rida: | ||
Kordust sooritatakse kuni tingimus saab tõeseks. | Kordust sooritatakse kuni tingimus saab tõeseks. | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a=20 | a=20 | ||
275. rida: | 307. rida: | ||
a=$(($a-1)) | a=$(($a-1)) | ||
done | done | ||
+ | </source> | ||
====Kordusest väljumine==== | ====Kordusest väljumine==== | ||
280. rida: | 313. rida: | ||
Kasutades korduse sees lisatingimust, on võimalik kordusest väljuda käsuga exit. Skripti täitmine jätkub kordusele järgnevast käsust. Näites sooritatakse kordus kuni muutuja $i saab võrdseks stringiga "teie" | Kasutades korduse sees lisatingimust, on võimalik kordusest väljuda käsuga exit. Skripti täitmine jätkub kordusele järgnevast käsust. Näites sooritatakse kordus kuni muutuja $i saab võrdseks stringiga "teie" | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
a="mina sina tema meie teie nemad" | a="mina sina tema meie teie nemad" | ||
291. rida: | 325. rida: | ||
echo "Skripti lõpp" | echo "Skripti lõpp" | ||
done | done | ||
+ | </source> | ||
===Sisend, väljund ja käsurea argumendid=== | ===Sisend, väljund ja käsurea argumendid=== | ||
296. rida: | 331. rida: | ||
Skripti sisendi vastuvõtmist korraldab käsk read. Loeme näites sisendit kuni andmete lõppemiseni ning trükime välja vastavad suured tähed. | Skripti sisendi vastuvõtmist korraldab käsk read. Loeme näites sisendit kuni andmete lõppemiseni ning trükime välja vastavad suured tähed. | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
while read a | while read a | ||
301. rida: | 337. rida: | ||
echo $a | tr "a-z" "A-Z" | echo $a | tr "a-z" "A-Z" | ||
done | done | ||
+ | </source> | ||
Suuname programmi df väljundi skripti sisendisse | Suuname programmi df väljundi skripti sisendisse | ||
327. rida: | 364. rida: | ||
Sisekäsk test võimaldab kontrollida faili tüüpi. Näiteks eristame kataloogis olevad lingid, tavalised faili ja kataloogid | Sisekäsk test võimaldab kontrollida faili tüüpi. Näiteks eristame kataloogis olevad lingid, tavalised faili ja kataloogid | ||
− | #!/bin/ | + | <source lang=bash> |
+ | #!/bin/bash | ||
for i in `ls -a` | for i in `ls -a` | ||
do | do | ||
338. rida: | 376. rida: | ||
fi | fi | ||
done | done | ||
+ | </source> | ||
===Sisestus märgini=== | ===Sisestus märgini=== | ||
351. rida: | 390. rida: | ||
Toome näite CGI valdkonnast | Toome näite CGI valdkonnast | ||
− | #!/bin/ | + | <source lang=bash> |
+ | #!/bin/bash | ||
echo -e "Content-type: text/html\n\n" | echo -e "Content-type: text/html\n\n" | ||
a=`df` | a=`df` | ||
cat <<mark | cat <<mark | ||
− | < HTML >< BODY > | + | <HTML><BODY> |
− | < p >Tere, masina failisüsteemiga on sellised lood:< p > | + | <p>Tere, masina failisüsteemiga on sellised lood:<p> |
− | < pre > | + | <pre> |
$a | $a | ||
− | < /pre > | + | </pre> |
− | < pre > | + | <pre> |
$(hostname -f) | $(hostname -f) | ||
$(date) | $(date) | ||
− | < /pre > | + | </pre> |
− | < /BODY >< /HTML > | + | </BODY></HTML> |
− | + | <source> | |
Kusjuures, kui 'cat <<mark' rida asendada 'cat <<\mark', siis muutujaid ei asendata ega väärtustata. | Kusjuures, kui 'cat <<mark' rida asendada 'cat <<\mark', siis muutujaid ei asendata ega väärtustata. | ||
373. rida: | 413. rida: | ||
Tihti esinevaid järgnevusi on mõistlik kirjeldada kord funktsioonina ning hiljem kasutada nende poole pöördumiseks seda funktsiooni. Näideks loome funktsiooni, mis paneb teksti < pre > ja < /pre > märkide vahele. | Tihti esinevaid järgnevusi on mõistlik kirjeldada kord funktsioonina ning hiljem kasutada nende poole pöördumiseks seda funktsiooni. Näideks loome funktsiooni, mis paneb teksti < pre > ja < /pre > märkide vahele. | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
function pre () { | function pre () { | ||
− | echo -e "< pre >$1< /pre >" | + | echo -e "<pre>$1</pre>" |
} | } | ||
− | echo -e "Content-type: text/html\n\n< HTML >< BODY >" | + | echo -e "Content-type: text/html\n\n<HTML ><BODY>" |
pre "`df`" | pre "`df`" | ||
pre "`uptime`" | pre "`uptime`" | ||
− | echo "< /BODY >< /HTML >" | + | echo "</BODY></HTML>" |
+ | </source> | ||
Funktsioonis kirjeldatu käivitamiseks ei tekitata uut koorikut. Argumente saab kasutada sarnaselt skriptile endale. | Funktsioonis kirjeldatu käivitamiseks ei tekitata uut koorikut. Argumente saab kasutada sarnaselt skriptile endale. | ||
387. rida: | 429. rida: | ||
Teise näitena küsime kinnitust kasutajalt mingi tegevuse toestamise kohta | Teise näitena küsime kinnitust kasutajalt mingi tegevuse toestamise kohta | ||
+ | <source lang=bash> | ||
kinnitus(){ | kinnitus(){ | ||
echo | echo | ||
398. rida: | 441. rida: | ||
fi | fi | ||
} | } | ||
+ | </source> | ||
Kasutamine järgnev | Kasutamine järgnev | ||
406. rida: | 450. rida: | ||
ehk siis lõpetanud enda tegevuse ebaviisakalt | ehk siis lõpetanud enda tegevuse ebaviisakalt | ||
+ | <source lang=bash> | ||
kas_korras(){ | kas_korras(){ | ||
RET=$? | RET=$? | ||
415. rida: | 460. rida: | ||
fi | fi | ||
} | } | ||
+ | </source> | ||
Ning seejärel võib lisada näiteks make käsu järele kontrollfuntskiooni | Ning seejärel võib lisada näiteks make käsu järele kontrollfuntskiooni | ||
428. rida: | 474. rida: | ||
skripti idee lihtsalt tuhat sekundit passida | skripti idee lihtsalt tuhat sekundit passida | ||
+ | <source lang=bash> | ||
#!/bin/sh | #!/bin/sh | ||
if [ -f /var/run/skript.lock ]; then | if [ -f /var/run/skript.lock ]; then | ||
435. rida: | 482. rida: | ||
lockf -t 0 /var/run/skript.lock '''sleep 1000''' | lockf -t 0 /var/run/skript.lock '''sleep 1000''' | ||
fi | fi | ||
+ | </source> | ||
Paneme skripti toimima taustal | Paneme skripti toimima taustal | ||
457. rida: | 505. rida: | ||
Näiteks saadame maili serverile postfix pordile ühe käsu | Näiteks saadame maili serverile postfix pordile ühe käsu | ||
+ | <source lang=bash> | ||
#avame socketi | #avame socketi | ||
exec 3<>/dev/tcp/zoo.edu.ee/25 | exec 3<>/dev/tcp/zoo.edu.ee/25 | ||
472. rida: | 521. rida: | ||
# sulgeme väljundi | # sulgeme väljundi | ||
exec 3>&- | exec 3>&- | ||
+ | </source> | ||
===Kasulikud lisamaterjalid=== | ===Kasulikud lisamaterjalid=== | ||
http://www.tinker.ncsu.edu/LEGO/shell_help.html | http://www.tinker.ncsu.edu/LEGO/shell_help.html |
Redaktsioon: 9. juuni 2010, kell 20:30
Sisukord
- 1 Bash kooriku skript
- 2 Skripti kirjutamine ja käivitamine
- 3 Skript käivitakse käsurealt
- 4 Muutuja ja väärtuse omistamine
- 5 Aritmeetilised tehted
- 6 Tingimused ja valikulause
- 7 If-elif-else valikulause
- 8 Case valikulause
- 9 Select valikulause
- 10 Korduslaused
- 11 Sisend, väljund ja käsurea argumendid
- 12 Failitestid
- 13 Sisestus märgini
- 14 Lock faili kasutamine skriptis
- 15 Bash ja internet
- 16 Kasulikud lisamaterjalid
Bash kooriku skript
Kooriku skript on tekstifail, millesse on kirjutatud üksteise järele programmi nimed või kooriku sisekäsud. Lisaks saab kasutada programmeerimisele iseloomulikke konstruktsioone, nagu tingimus, kordus- ja valiklause jne. Koorik on interpreteeritav keel.
Paljud süsteemi utiliidid on kooriku skriptid.
Skripti kirjutamine ja käivitamine
Kooriku skript kirjutatakse tekstiredaktoris, kusjuures failil peab olema lugemis- ja käivitamisõigus.
Näiteks toome skpriti, mis kirjutab ekraanile "Näe, poolkuu".
#!/bin/sh
echo "Näe, poolkuu"
Selgituseks märgime, et
- #!/bin/sh näitab interpretaatori nime
- echo on sisekäsk, mis väljastab ekraanile oma argumendi
Skript käivitakse käsurealt
Esmalt tuleb skript teha käivitatavaks öeldes
$ chmod 0755 skript.sh
ja käivitada
$ ./skript.sh
Heaks kombeks on skripti nimi lõpetada mõnetähelise kombinatsiooniga, mis viitab interpretaatorile - '.sh'.
Skripti käivitamisel käivitatakse uus koorik, milles skripti käsud täidetakse.
Muutuja ja väärtuse omistamine
Muutuja nimi peab algama tähe või alakriipsuga, kusjuures võib sisaldada neid ja ka numbreid. Muutuja tüüpi pole tarvis deklareerida.
Muutujale väärtuse omistamisel märgitakse teda vaid nimega (a_1), kuid talle viidates peab alustama muutuja nime dollar ($a_1). Näites omistatakse võrdusmärgi abil muutujale väärtus ja kasutatakse seda
#!/bin/sh
a_1=5
b_1=$a_1
c_1=Tere
echo $a_1
echo $b_1
echo $c_1
Tühikute olemasolu ja puudumine on oluline.
Kui muutujale väärtust omistades on vaja vältida metasümbolite erilist käsitlust, siis tuleb avaldis kirjutada ülakomade vahele, näiteks
#!/bin/sh echo 'Ei asenda keskkonnamuutujat $OSTYPE tema väärtusega'
Kui on tarvis, et keskkonnamuutujad asenduksid oma väärtustega ning toimuks muutuja väärtustamine, siis kasutatakse jutumärke, näiteks
#!/bin/sh
echo "Keskkonnamuutujate asemele tekivad nende väärtused: $OSTYPE"
echo "Muutujad väärtustatakse: $(date)"
echo "Käsud väärtustatakse: `date`"
echo "Aritmeetiline väärtustamine: 11 + 11 = $((11+11))"
Aritmeetilised tehted
Esitame näited aritmeetiliste tehete kohta
- "+, -" - liitmine ja lahutamine
- "*, /, %" - korrutamine, jagamine ja jääk
- "<<, >>" - bitinihe
#!/bin/sh
a=255
b=1
c=5
d=50
a_miinus_c=$(($a - $b))
a_jaak_d=$(($a % $d))
a_bitinihe_paremale_b=$(($a >> $b))
echo "$a - $b = $a_miinus_c"
echo "$a % $d = $a_jaak_d"
echo "$a >> $b = $a_bitinihe_paremale_b"
Tingimused ja valikulause
Valikulause võimaldab vastavalt seatud tingimustele programmi edasist käiku suunata.
Arvulisi suurusi võrreldakse järgmiste loogiliste operaatoritega
- -eq - võrdne (ingl. k. equal)
- -ne - mittevõrdne (ingl. k. not equal)
- -lt - väiksem (ingl. k. less than)
- -le - väiksemvõrdne (ingl. k. less equal)
- -gt - suurem (ingl. k. greater than)
- -ge - suuremvõrdne (ingl. k. greater equal)
Näiteks tingimus
[ 5 < 6 ]
on tõene kuna "viis on väiksem kuuest".
If-elif-else valikulause
Skript genereerib juhusliku arvu vahemikus 0 kuni 32 767 (2^15) ja teatab, milline see on
#!/bin/sh
a=$RANDOM
if [ $a -lt 10000 ]; then
echo "Juhuslik arv $a < 10 000"
elif [ $a -ge 10000 -a $a -lt 20000 ]; then
echo "Juhuslik arv on 10 000 <= $a < 20 000"
else [ $a -ge 20000 -a $a -lt 32767 ]
echo "Juhuslik arv on 20 000 <= $a < 32767"
fi
Näites esitatakse tingimused, kusjuures
- -a (AND) nõuab mõlema tingimuse samaaegset täidetust
- -o (OR) väljendab, et täidetud võib olla üks või teine või mõlemad.
- ! (NOT) alustades tingimust hüüumärgiga märgitakse eitust
Näiteks tingimus
[ ! 5 < 6 ]
on väär kuna "viis on väiksem kuuest", aga kasutatakse loogilist eitust (!).
Kantsulgude asemel võib tingimuse esitamisel kasutada suvalist programmi. Sel juhul tõlgendatakse programmi lõppkoodi väärtust tõeväärtusena, so 0 on tõene ja muu väär. Näites saadab õppejõud igale praktikumist puudujale kirja, milles ta vabandab, et viib õppetööd läbi ilma tegelase osavõtuta
#!/bin/sh
for i in priit miima peeter mart liibu
do
if ! who | grep $i ; then
echo -e "Subject: Ma vabandan, et Teid polnud kohal\n\n." | \
/usr/sbin/sendmail $i
fi
done
Nagu ikka, peab rida jätkav kaigas olema viimane sümbol real.
Tihti kasutatakse tingimuste esitamisel spetsiaalset sisekäsku test. Esitame näite selle käsu kasutamisest
#!/bin/sh
a=$RANDOM
if test $a -lt 10000; then
echo "Juhuslik arv $a < 10 000"
elif test $a -ge 10000 -a $a -lt 20000; then
echo "Juhuslik arv on 10 000 <= $a < 20 000"
else test $a -ge 20000 -a $a -lt 32767
echo "Juhuslik arv on 20 000 <= $a < 32767"
fi
If-else tingimust saab esitada ka && (AND) ja || (OR) abil
#!/bin/sh
a=$RANDOM
(test $a -lt 15000 && echo "$a < 15 000" ) || echo "$a >= 15 000"
&& -le järgnev käsk täidetakse, kui eelnenud käsu lõppkood oli null (tõene). || -le järgnev käsk täidetakse, kui eelnenud käsu lõppkood oli üks (väär).
Loogiliste tehetega mängimiseks on otstarbekas kasutada spetsiaalseid programme true ja false, mis ei tee muud, kui tagastavad vastava lõppkoodi
bash~$ (true && echo "õige" ) || echo "väär"
õige
bash~$ (false && echo "õige" ) || echo "väär"
väär
Tavaline on skriptides kontrollida mingite muutujate seadistust, näiteks kontrollime kas ssl kataloog on seadistatud
if [ "$MOD_SSL_DIR" = "" ]
then
echo "MOD_SSL_DIR seadmata"
exit 1
fi
Leksikograafilisi tingimusi esitatakse järgmiste loogiliste operaatorite abil
* = võrdne * != mittevõrdne
Esitame näite, kus skript ootab vastust küsimusele, "Kes on Kuutõrvaja üks peategelaskujusid?"
#!/bin/sh
echo "Kes on Kuutõrvaja üks peategelaskujusid?\n"
read vastus
if [ $vastus = "Priit" ]; then
echo "Õige"
else
echo "Vale"
fi
Rida 'read vastus' ootab klaviatuurilt sisestust ning omistab selle muutuja $vastus väärtuseks.
Case valikulause
Case valik võimaldab valida mitme tegevuse vahel. Näide teatab, kas sisestatud sõna algustäht oli vahemikust A-K, L-Z või midagi muud
#!/bin/sh
echo "Sisestage klaviatuurilt sõna:"
read a
case $a in
[a-k]*|[A-K]*) echo "Sisestatud sõna algab tähega vahemikust A kuni K";;
[l-z]*|[L-Z]*) echo "Sisestatud sõna algab tähega vahemikust L kuni Z";;
*) echo "Midagi muud";;
esac
Valikut määrav regulaaravaldise stiilis avaldis [a-k]*|[A-K]* tähendab, et klapivad stringid, mis algavad väikese vahemikku a kuni k jääva tähega või samasse vahemikku jääva suure tähega.
Select valikulause
See on väga sarnane Case valikule olles interaktiivsem
#!/bin/sh
select i in "Tartu" "Valga" "Paide" "Ahja" "Ots"
do
case $i in
Tartu) echo "Tartu" ;;
Valga) echo "Valga" ;;
Paide) echo "Paide" ;;
Ahja) echo "Ahja" ;;
Ots) exit ;;
*) echo "midagi muud" ;;
esac
done
Korduslaused
Kordus võimaldab teatud arv kordi korrata tegevust.
For korduslause
For korduses seatakse tavaliselt otseselt paika korduste arv. Toome näite
#!/bin/sh
a="Tartu Elva Puhja Polva"
for i in $a
do
echo $i
done
Iga järgmise kordusega omandab muutuja $i uue väärtuse nimekirjast, milleks on muutuja $a tühikuga eraldatud alamstringid. Muutujale $a võib väärtust omistada ka kasutades käsu väärtustamist, näiteks jätame muutuja $a enda kasutamata
#!/bin/sh
for i in `ls r*`
do
echo $i
done
Näites kuvatakse kõik r tähega algavad failinimed.
While korduslause
While kordust korratakse kuni tingimus on tõene. Näites sooritatakse kordus kuni muutuja $a on väiksem kümnest
#!/bin/sh
a=0
while [ $a -lt 10 ]
do
echo $a
a=$(($a+1))
done
Until korduslause
Kordust sooritatakse kuni tingimus saab tõeseks.
#!/bin/sh
a=20
while [ $a -lt 10 ]
do
echo $a
a=$(($a-1))
done
Kordusest väljumine
Kasutades korduse sees lisatingimust, on võimalik kordusest väljuda käsuga exit. Skripti täitmine jätkub kordusele järgnevast käsust. Näites sooritatakse kordus kuni muutuja $i saab võrdseks stringiga "teie"
#!/bin/sh
a="mina sina tema meie teie nemad"
for i in $a
do
if test $i = "teie"; then
exit
else
echo $i
fi
echo "Skripti lõpp"
done
Sisend, väljund ja käsurea argumendid
Skripti sisendi vastuvõtmist korraldab käsk read. Loeme näites sisendit kuni andmete lõppemiseni ning trükime välja vastavad suured tähed.
#!/bin/sh
while read a
do
echo $a | tr "a-z" "A-Z"
done
Suuname programmi df väljundi skripti sisendisse
bash~$ df | skript.sh
Skripti väljund tekitatakse tavaliselt käsuga echo.
Skripti käivitamisel saab anda ka argumente, kusjuures nende väärtused on skriptis muutujates $1, $2 jne.
#!/bin/sh echo $1 $2 $3
Lisaks on olulised sellised muutujad
- * - "$*" väärtustub stringiks, kus on kõik argumendid tühikutega eraldatud
- @ - "$@" väärtustub mitmeks stringiks, mis on vastavalt käsurea argumendid
- # - "$#" käsurea argumentide arv
- ? - "$?" eelmise esiplaanil käivitatud programmi väljundkood
- $ - "$$" skripti enda PID
- ! - "!$" viimati tagaplaanil käivitatud programmi nimi
- 0 - "$0" skripti enda nimi
Failitestid
Sisekäsk test võimaldab kontrollida faili tüüpi. Näiteks eristame kataloogis olevad lingid, tavalised faili ja kataloogid
#!/bin/bash
for i in `ls -a`
do
if test -f $i; then
echo $i: fail
elif test -L $i; then
echo $i: link
elif test -d $i; then
echo $i: kataloog
fi
done
Sisestus märgini
Märgini sisestamine võimaldab vältida mitmete järjestikuste käskude echo kasutamist.
cat >> /home/kasutaja/fail <<EOT esimene rida teine rida kolmas rida EOT
Toome näite CGI valdkonnast
#!/bin/bash
echo -e "Content-type: text/html\n\n"
a=`df`
cat <<mark
<HTML><BODY>
<p>Tere, masina failisüsteemiga on sellised lood:<p>
<pre>
$a
</pre>
<pre>
$(hostname -f)
$(date)
</pre>
</BODY></HTML>
<source>
Kusjuures, kui 'cat <<mark' rida asendada 'cat <<\mark', siis muutujaid ei asendata ega väärtustata.
===Funktsioonid===
Tihti esinevaid järgnevusi on mõistlik kirjeldada kord funktsioonina ning hiljem kasutada nende poole pöördumiseks seda funktsiooni. Näideks loome funktsiooni, mis paneb teksti < pre > ja < /pre > märkide vahele.
<source lang=bash>
#!/bin/sh
function pre () {
echo -e "<pre>$1</pre>"
}
echo -e "Content-type: text/html\n\n<HTML ><BODY>"
pre "`df`"
pre "`uptime`"
echo "</BODY></HTML>"
Funktsioonis kirjeldatu käivitamiseks ei tekitata uut koorikut. Argumente saab kasutada sarnaselt skriptile endale.
Teise näitena küsime kinnitust kasutajalt mingi tegevuse toestamise kohta
kinnitus(){
echo
echo
echo -n "$1 (y/n) [n] "
read VASTUS
if [ "$VASTUS" != "y" ]
then
exit
fi
}
Kasutamine järgnev
kinnitus "installime vajalikud komponendid ?"
Üks shelliskriptis suisa häda vajalik funktsioon oleks kontrollida kas eelmine käsk on väljastanud mingi veateate ehk siis lõpetanud enda tegevuse ebaviisakalt
kas_korras(){
RET=$?
if [ "$RET" != '0' ]
then
echo
echo "eelmine käsk väljastas: $RET"
exit $RET
fi
}
Ning seejärel võib lisada näiteks make käsu järele kontrollfuntskiooni
kas_korras
Lock faili kasutamine skriptis
Vahel on vajalik saavutada olukord kus skripti selle töötamise ajal uuesti enam käivitada ei saa, siin tuleb appi lockf abil tekitatav /var/run/skript.lock nimeline fail
skripti idee lihtsalt tuhat sekundit passida
#!/bin/sh
if [ -f /var/run/skript.lock ]; then
echo "eelmine programm ikka veel toimib."
return
else
lockf -t 0 /var/run/skript.lock '''sleep 1000'''
fi
Paneme skripti toimima taustal
# ./skript.sh & [1] 80562
proovime veelkord startida
# ./skript.sh eelmine programm ikka veel toimib.
Lockfaili võib muidugi käsu lockf puudumisel tekitada ka lihtsalt touch käsuga ja hiljem eemaldada
Bash ja internet
Bash võimaldab tegeleda ka võrgusocketitega. Viimaste kaudu on võimalik avada võrguühendus teatava serveri pordini ja vahetada sellega infot.
See käib läbi socketi mis kujul /dev/tcp/SERVER/PORT
Näiteks saadame maili serverile postfix pordile ühe käsu
#avame socketi
exec 3<>/dev/tcp/zoo.edu.ee/25
# saadame HELO käsu
echo -e "HELO mail.edu.ee" >&3
# loeme tulemust
while read line <&3
do
echo -n $line >&1
done
# saadame QUIT käsu
echo -e "QUIT" >&3
# sulgeme sisendi
exec 3<&-
# sulgeme väljundi
exec 3>&-