Tazi statiia e prevedena s razreshenieto na avtora i
X_console.
Adresut na originalnata statiia e http://xfactor.itec.yorku.ca/~xconsole/.
Kakto vsichki shelove, koito mozhe da namerite za
Linux BASH (Bourne Again SHell) e ne
samo
otlichen komanden interpretator no i ezik za pisane na
kriptove. SHel(Shell) skriptovete vi pozvoliavat
maksimalno da izpolzvate vuzmozhnostite na shel interpretatora
i da
avtomatizirate mnozhestvo zadachi. Mnogo ot programite, koito
mozhe da namerite za Linux v posledno vreme sa shel skriptove.
Ako iskate da razberete kak te rabotiat ili kak mozhe da gi
redaktirate e vazhno da rabirate sintaksisa i semantikata na
BASH shela. V dopulnenie poznavaneto na bash ezika vi
pozvoliava da napishete vashi sobstveni programi, koito da
izpulniavat tochno
tova koeto iskate.
Programirane ili pisane na skripove?
Horata koito do sega ne sa se zanimavali s
programirane obiknoveno ne razbirat razlikata
mezhdu programen i skript ezik. Programnite ezitsi
obiknoveno sa po-moshtni i po-burzi ot skript
ezitsite. Primeri za programni ezitsi sa C, C++, i Java.
Programite koito se pishat na tezi ezitsi obiknoveno zapochvat
ot izhoden kod (source code) - tekst koito sudurzha
instruktsii za tova kak
okonchatelnata programa triabva da raboti sled koeto se
kompilirat do izpulnim fail. Tezi izpulnimi failove ne mogat
lesno da budat adaptirani za razlichni operatsionni sistemi
(OS).
Naprimer ako ste napisali programa na C za Linux
izpulnimiiat fail niama da trugne pod Windows 98. Za da mozhete
da ia izpolzvate tazi programa se nalaga da prekompilirate
izhodniia kod pod Windows 98. Skriptovete (programite pisani
na skript ezitsi) sushto zapochvat ot izhoden, no ne se
kompilirat
v izpulnimi failove. Pri tiah se izpolva interpretator koito
chete instruktsiite ot izhodniia kod i gi izpulniava. Za zhalost,
poradi tova che interpretatora triabva da prochete vsiaka
komanda predi da ia izpulni, interpretiranite programi
vurviat kato tsialo po-bavno spriamo kompiliranite. Osnovnoto
predimstvo na skriptovete se e, che lesno mogat da budat
prenapisani za drugi OS stiga da ima
interpretator za tazi OS. bash
e skript ezik.
Toi e idealen za malki programi. Drugi skrip ezitsi sa Perl, Lisp, i Tcl.
Kakvo iskate da znaete?
Pisaneto na sobstveni shel skriptove iziskva ot
vas da znaete nai-osnovnite komandi na Linux. Triabva
da znaete naprimer kak da kopirate, mestite ili
suzdavate novi failove. Edno ot neshtata koeto e zadulzhitelno
da znaete e kak da rabotite s tekstov redaktor. Za Linux ima
mnozhestvo tekstovi redaktori nai-razprostranenite ot koito
sa vi
, emacs
, pico
,
mcedit.
Vnimanie!!!
Ne se uprazhniavaite v pisane na skriptove kato root
potrebitel! Ne se znae kakvo mozhe da se sluchi! Az
niama da buda otgovoren ako vie po nevnimanie
povredite viashata sistema. Imaite tova v predvid!
Za uprazhneniiata izpolvaite normalen potrebitel
bez prava na root.
Vashiiat purvi BASH skript
Purviiat skript koito shte napishete e klasicheskata
"Hello World" programa. Tazi programa izpechatva
edinstveno dumite "Hello World" na ekrana.
Otvorete lyubimiia si tekstov redaktor i napishete:
#!/bin/bash
echo "Hello World"
Purviiat red ot programata kazva che shte
izpolzvame bash
interpretatora za da podkarame
programata. V tozi sluchai bash
se namira
v /bin
direktoriiata. Ako bash
se
namira v druga direktoriia na vashata sistema togava
napravete neobhodimite premeni v purviia red. Izrichnoto
spomenavane na tova koi interpretatator shte izpulniava skripta
e mnogo vazhno, tui kato toi kazva na Linux kakvi instruktsii
mogat da budat izpolzvani v skripta. Sledvashtoto neshto koeto
triabva da napravite e da zapishete faila pod imeto
hello.sh
. Ostava
samo da napravite faila izpulnim. Za tselta pishete:
xconsole$ chmod 700 ./hello.sh
Prochetete uputvaneto za izpolzvane na chmod
komandata ako ne znaete kak da promeniate pravata
na daden fail. Sled kato ste napravili programata
izpulnima ia startiraite kato napishete:
xconsole$ ./hello.sh
Rezultatut ot koiato shte bude sledniiat nadpis na
ekrana
Hello World
Tova e! Zapomnete posledovatelnosta ot
deistviia - pisane na koda, zapisvane na faila s koda, i
promenianeto na faila v izpulnim s komandata
chmod
.
Komandi, Komandi, Komandi
Kakvo tochno napravi vashata purva programa? Tia
izpechata dumite "Hello World" na ekrana. No kak
programata go napravi tova? S pomoshta na komandi.
Edinstveniiat red s komandi beshe echo "Hello
World"
. I koia e komandata?
echo
. Komandata echo
izpechatva vsichko na ekrana, koeto e poluchila kato svoi
argument.
Argument e vsichko koeto e napisano sled imeto
na komandata. V nashiiat sluchai tova e "Hello
World"
. Kogato napishete ls
/home/root
, komandata e ls a neiniiat argiment
e /home/root
. Kakvo oznachava vsichko tova? Tova
oznachava che ako imate programa ili komanda, koiato izpechatva
argumentite si na ekrana to mozhe da ia
izpolzvate vmesto echo
. Neka da predpolozhim che
imame takava komanda koiato se kazva foo
.
Tazi komada shte izpechata svoite argumenti na ekrana. Togava
nashiiat skript mozhe da izglezhda taka:
#!/bin/bash
foo "Hello World"
Zapishete go i go napravete izpulnim s chmod
sled koeto go startiraite:
xconsole$ ./hello
Hello World
Tochno sushtiiat rezultat. Vsichko koeto pravihte do
sega e da izpolzvate echo
komandata vuv
vashiia shel skript. Druga komanda za izpechatvane e
printf
. Komandata printf
pozvoliava
poveche kontrol pri izpechatvane na informatsiiata, osobeno ako
ste zapoznati s programniia ezik C. Fakticheski sushiiat
rezultat ot nashiiat skript mozhem da postignem prosto ako
napishem v
komandniia red:
xconsole$ echo "Hello World"
Hello World
Kakto vizhdate mozhe da izpolzvate Linux komandi
pri pisaneto na shel skriptove. Vashiiat bash shel
skript e kolektsiia ot razlichni programi, spetsialno napisani
zaedno za da izpulniat konkretna zadacha.
Malko po-lesni programi
Sega shte napishem programa s koiato da premestim vsichki
failove ot dadena direktoriia v nova direktoriia, sled koeto
shte iztriem novata direktoriia zaedno sus neinoto sudurzhanie i
shte ia
suzdadem otnovo. Tova mozhe da bude napraveno sus slednata
posledovatelnost ot komandi:
xconsole$ mkdir trash
xconsole$ mv * trash
xconsole$ rm -rf trash
xconsole$ mkdir trash
Vmesto da pishem posledovatelno tezi komandi
mozhem da gi zapishem vuv fail:
#!/bin/bash
mkdir trash
mv * trash
rm -rf trash
mkdir trash
echo "Deleted all files!"
Zapishete faila pod imeto clean.sh
. Sled
kato startirate clean.sh
toi shte premesti
vsichki failove v direktoriia trash,
sled koeto shte iztrie direktoriiata zaedno sus sudurzhanieto i
shte ia suzdade otnovo. Dori shte izpechata suobshtenie na ekrana,
kogato svurshi sus tezi deistviia. Tozi primer pokazva i kak
da
avtomatizirate mnogokratnoto pisane na posledovatelnosti ot
komandi.
Komentari vuv skripta
Komentarite vi pomagat da napravite vashata
programa po-lesna za razbirane. Te ne promeniat
nishto v izpulnenieto na samata programa . Te se
izpolzvat edinstveno za da mozhe vie da gi chetete.
Vsichki komentari v bash
zapochvat sus
simvola: "#
", s izklyuchenie na purviia
red (#!/bin/bash
). Purviiat red ne e komanda.
Vsichki redove sled purviia koito zapochvat sus
"#
" sa komentari. Vizhte koda na
sledniia skript:
#!/bin/bash
# tazi programa broi chislata ot 1 do 10:
for i in 1 2 3 4 5 6 7 8 9 10; do
echo $i
done
Dori i da ne znaete bash
, vie vednaga mozhe
da se orientirate kakvo pravi skripta, sled kato
prochetete komentara. Dobre e pri pisane na
skriptove da izpolzvate komentari. SHTe otkriete, che ako vi
se nalozhi da promenite nakoia programa koiato ste pisali predi
vreme, komentarite shte vi budat ot goliama polza.
Promenlivi
Promenlivite, nai-obshto kazano, sa "kutii"
koito suhraniavat informatsiia. Vie mozhe da izpolzvate
promenlivi za mnogo neshta. Te vi pomagat da suhraniavate
informatsiiata koiato e vuvel potrebitelia, argumenti ili
chislova informatsiia. Poglednete tozi kod:
#!/bin/bash
x=12
echo "Stoinosta na promenliwata x e $x"
Vsichko koeto se sluchva e da prisvoim na
promenlivata x stoinost 12
i da ia
otpechatame tazi stoinost s komadata echo. echo
"Stoinosta na promenliwata x e $x"
izpechatva tekushtata stoinost na x
. Kogato davate
stoinost na
dadena promenliva ne triabva da ima shpatsii mezhdu neia i
"=". Eto kakuv e sintaksisa:
ime_na_promenliva=stoinost
Stoinosta na promenlivata mozhem da poluchim
kato postavim simvola "$
" pred neia.
V konkretniia sluchai za da izpechatame
stoinosta na& x
pishem echo
$x
.
Ima dva tipa promenlivi - lokalni promenlivi i
promenlivi na obkruzhenieto(environment). Promenlivite
na obkruzhenieto se zadavat ot sistemata i
informatsiia za tiah mozhe da se poluchi kato se
izpolzva env
komandata. Naprimer:
xconsole$ echo $SHELL
SHTe otpechata
/bin/bash
Koeto e imeto na shela koito izpolzvame v
momenta. Promenlivite na obkruzhenieto sa
definirani v /etc/profile
i
~/.bash_profile
.
S echo
komandata mozhete lesno da
proverite tekushtata stoinost na dadena promenliva, bilia tia
ot obkruzhenieto ili lokalna. Ako vse oshte se chudite zashto sa
ni nuzhni promenlivi slednata programa e dobur primer koito
ilyustrira tiahnoto izpolzvane:
#!/bin/bash
echo "Stojnosta na x e 12."
echo "Az imam 12 moliwa."
echo "Toj mi kaza che stojnosta na x e 12."
echo "Az sym na 12 godini."
echo "Kak taka stojnosta na x e 12?"
Da predpolozhim che v edin moment reshite da
promenite stoinosta na x ot 12 na 8. Kakvo triabva da
napravite? Triabva da premenite navsiaskude v
koda 12 s 8. Da no... ima redove v koito 12 ne e
stoinosta na x. Triabva li da promeniame i tezi
redove? Ne zashtoto te ne sa svurzani s x
. Ne e
li oburkvashto? Po nadolu e sushtiia primer samo che se
izpolzvat promenlivi:
#!/bin/bash
x=12 # stoinosta na promenliwata x e 12 e
x
echo "Stoinosta na x e $x."
echo "Az imam 12 moliwa."
echo "Toj mi kaza che stojnosta na x e $x."
echo "Az sym na 12 godini."
echo "Kak taka stojnosta na x e $x?"
V tozi primer $x
shte izpechata tekushtata
stoinost na x
, koiato e 12. Po tozi nachin ako
iskate da promenite stoinosta na x ot 12 na 8
e neobhodimo edinstveno da zamenite reda v koito
pishe x=12
s x=8
. Drugite redovete
niama da budat promeneni. Promenliviti imat i dugi
polezni svoistva kakto shte se ubedite sami v
posledstvie.
[ krai na chast 1]
Vizhte [ CHast 1| CHast
2 |
CHast
3 |
CHast
4]