Tazi statiia e prevedena s razreshenieto na avtora i X_console.
Adresut na originalnata statiia e http://xfactor.itec.yorku.ca/~xconsole/.
Produlzhenie na [ chast 3 ].
AND i OR
Vidiahme kak se izpolzvat uslovnite operatori i kolko polezni sa te. Ima dve
dopulnitelni neshta, koito mogat da budat dobaveni. Uslovnite izrazi sa AND (ili
"&&") i OR (ili "||"). AND uslovniiat izraz izglezhda po sledniia nachin:
uslovie_1 && uslovie_2
AND izrazut proveriava purvo nai-liavoto uslovie. Ako uslovieto e viarno se proveriava
vtoroto uslovie. Ako i to e viarno se izpulniava ostanalata chast ot koda na skripta.
Ako uslovie uslovie_1 ne e viarno(vurne rezultat false), togava uslovie
uslovie_2 niama da bude provereno. S drugi dumi:
if(ako) uslovie_1 e viarno, AND(i) if(ako) uslovie_2 e
viarno, then(togava)...
Eto edin primer s AND uslovie:
#!/bin/bash
x=5
y=10
if [ "$x" -eq 5 ] && [ "$y" -eq 10 ]; then
echo "I dwete uslowiq sa wqrni."
else
echo "Uslowiqta ne sa wqrni."
fi
Tuk vizhdame, che x i y imat stoinostta, za koiato proveriavame. Promenete stoinosta
na x ot x=5 na x=12, sled koeto pusnete otnovo programata i shte se ubedite, che
uslovieto ne e izpulneno( vrushta stoinost false).
OR izrazut e podoben. Edinstvenata razlika e, che proveriava dali nai-leviiat
izraz ne e veren(t.e vrushta rezultat false). Ako tova e izpulneno se proveriava
sledvashtiia izraz i po-sledvashtiia:
uslovie_1 || uslovie_2
S drugi dumi tova zvuchi taka:
if(ako) uslovie_1 e viarno, OR(ili) ako uslovie_2 e
viarno, togava...
Eto zashto kodut sled tozi usloven operator shte
bude izpulnen ako pone edno ot
usloviiata e viarno:
#!/bin/bash
x=3
y=2
if [ "$x" -eq 5 ] || [ "$y" -eq 2 ]; then
echo "Edno ot uslowiqta e wqrno."
else
echo "Nito edno ot uslowiqta ne e wqrno."
fi
V tozi primer shte se uverite, che edno ot usloviiata e viarno. Smenete stoinostta
na promenlivata y i izpulnete otnovo programata. SHTe vidite, che nito edno ot
usloviiata ne e viarno.
Ako se zamislite, shte vidite, che uslovniiat operator if mozhe da zamesti upotrebata
na AND i OR izrazite. Tova stava chrez izpolzvaneto na vlozheni if operatori.
"Vlagane na if operatori" oznachava da izpolzvame if operator v tialoto na drug
if operator. Mozhete da pravite vlagane i na drugi operatori, a ne samo na if.
Eto edin primer s vlozheni ifoperatori, koito zamestvat izpolzvaneto na AND izraz
v koda na programata:
#!/bin/bash
x=5
y=10
if [ "$x" -eq 5 ]; then
if [ "$y" -eq 10 ]; then
echo "I dwete uslowiq sa wqrni."
else
echo "Uslowiqta ne sa wqrni."
fi
fi
Rezultatut e sushtiiat, kakto i ako izpolzvahme AND izraz. Problemut e, che kodut
stava po - trudno chetim i otnema poveche vreme, za da se napishe. Za da se predpazite
ot problemi izpolzvaite AND i OR izrazi.
Izpolzvane na argumenti
Mozhe bi ste zabeliazali, che povecheto programi v Linux ne sa interaktivni. Ot
Vas se iska da vuvedete niakakvi argumenti; v protiven sluchai poluchavate suobshtenie,
v koeto se obiasniava kak da izpolzvate programata. Vzemete za primer komandata
more. Ako ne napishete ime na fail sled neia, rezultatut shte bude tochno edno takova
pomoshtno suobshtenie. Vuzmozhno e da napravite vashata shel programa da izpolzva argumenti.
Za tazi tsel triabva da izpolzvate spetsialnata promenliva "$#". Tazi promenliva
sudurzha obshtiia broi na vsichki argumenti podadeni na programata. Naprimer ako
izpulnite slednata programa:
xconsole$ foo argument
$# shte ima stoinost 1 , zashtoto ima samo edin argument podaden na programata.
Ako imate dva argumenta, togava $# shte ima stoinost 2. V dopulnenie stoinostta
na vseki argument (nuleviiat argument e vinagi imeto na programa - foo) mozhe
da se vzeme kato izpolzvate promenlivite $0 - za imeto na programata v sluchaia
foo, $1 za stoinosta na purviiat argument -argument i t.n. Mozhe da imate
maksimum 9 takiva promenlivi ot $0 do $9. Neka da vidim tova v deistvie:
#!/bin/bash
# izpechataj pyrwiq argument
# proweri dali ima pone edin argument:
if [ "$#" -ne 1 ]; then
echo "usage: $0 "
fi
echo "Stojnosta na argumenta e $1"
Tazi programa ochakva edin i samo edin argument, za da trugne. Ako ia startirate
bez argumenti, ili podadete poveche ot edin argument, programata shte izpechata
suobshtenie za tova kak da se izpolzva. V sluchai, che imame samo edin argument
shel programata shte otpechata stoinosta na argumenta, koito ste podali. Pripomnete
si, che $0 e imeto na programata. Eto zashto tazi spetsialna promenliva se izpolzva
v "usage" suobshtenieto.
Prenasochvane i PIPING
Obiknoveno, kogato startirate dadena komanda, rezultatut ot izpulnenieto se
otpechatva na ekrana. Naprimer:
xconsole$ echo "Hello World"
Hello World
"Prenasochvaneto" Vi pozvoliava da suhranite rezultata ot izpulnenieto niakude
drugade. V povecheto sluchai tova stava kum fail. Operatorut ">" se izpolzva za
prenasochvane na izhoda. Mislete za nego kato za strelka, socheshta kude da otide
rezultata. Eto edin primer za prenasochvane na izhoda kum fail:
xconsole$ echo "Hello World" > foo.file
xconsole$ cat foo.file
Hello World
Tuk rezultatut ot komandata echo "Hello World" e prenasochen kum fail s ime
foo.file. Kogato prochetete sudurzhanieto na faila shte vidite tam rezultata. Ima
edin problem, kogato izpolzvate operatora ">". Ako imate fail sus sushtoto ime,
to negovoto sudurzhanie niama da bude zapazeno, a shte bude iztrito i zamesteno
s novoto. Ami ako iskate da dobavite informatsiia vuv faila, bez da iztrivate
starata? Togava triabva da izpolzvate operatorut za dobaviane : ">>". Izpolzva
se po sushtiia nachin s tazi razlika, che ne iztriva staroto sudurzhanie na faila,
a go zapazva i dobavia novoto sudurzhanie nakraia.
A sega shte vi zapoznaem s piping. Piping-ut
Vi pozvoliava da vzemete rezultata ot izpulnenieto na dadena programa i da go
izpolzvate kato vhodni danni za druga programa. Piping stava
posredstvom operatora: "|". Zabelezhete, che tova ne e malkata bukvata "L". Tozi
operator mozhe da poluchite chrez natiskane na klavisha SHIFT i \. Eto i edin primer
za piping:
xconsole$ cat /etc/passwd | grep xconsole
xconsole:x:1002:100:X_console,,,:/home/xconsole:/bin/bash
Tuk chetem tseliia fail /etc/passwd i sled tova rezultatut e podaden za obrabotka
na komandata grep, koiato ot svoia strana pretursva teksta za niza xconsole i
izpechatva tseliia red, sudurzhasht tozi niz na ekrana. Mozhe da izpolzvate i prenasochvane,
za da zapishete krainiia rezultat na fail:
xconsole$ cat /etc/passwd | grep xconsole > foo.file
xconsole$ cat foo.file
xconsole:x:1002:100:X_console,,,:/home/xconsole:/bin/bash
Raboti. Failut /etc/passwd e procheten i negovoto sudurzhanie e preturseno ot
komandata grep za niza xconsole. Sled koeto krainiiat rezultat e prenasochen kum
fail foo.file. SHTe otkriete, che prenasochvane i piping sa mnogo polezni sredstva,
kogato pishete Vashite shel programi.
Vremenni failove
CHesto shte ima momenti, v koito shte Vi se nalozhi da suzdadete vremenen fail. Tozi
fail mozhe da sudurzha vremenna informatsiia i prosto da raboti s niakoia programa.
V povecheto sluchai sus zavurshvaneto na izpulnenieto na programata se iztriva
i vremenniiat fail. Kogato suzdadete fail triabva da mu zadadete ime. Problemut
e, che imeto na faila, koito suzdavate ne triabva da sushtestvuva v direktoriiata,
v koiato go suzdavate. V protiven sluchai mozhe da zatriete vazhna informatsiia. Za
da suzdadete fail s unikalno ime triabva da izpolzvate "$$" simvola kato predstavka
ili nadstavka v imeto na faila. Vzemete za primer sledniia sluchai: iskate da
suzdadete vremenen fail s ime hello. Ima veroiatnost i niakoi drug da ima fail
sus sushtoto ime v tazi direktoriia, koeto shte dovede do katastrofalni rezultati
za Vashata programa. Ako vmesto tova suzdadete fiail s ime hello.$$ ili $$hello,
Vie shte suzdadete unikalen fail. Opitaite:
xconsole$ touch hello
xconsole$ ls
hello
xconsole$ touch hello.$$
xconsole$ ls
hello hello.689
Eto go i nashiiat vremenen fail.
Vrushtane na stoinosti
Povecheto programi vrushtat stoinost(i) v zavisimost ot nachina, po koito zavurshvat
izpulnenieto si. Naprimer, ako razgledate rukovodstvoto na komandata grep shte
vidite, che v nego se kazva, che komandata grep vrushta stoinost 0 ako ima suvpadenie,
i 1 ako ne e otkrito suvpadenie. Zashto da se grizhim da vrushtame stoinosti? Po
mnogo prichini. Neka da kazhem, che iskate da proverite dali konkretno potrebitelsko
ime sushtestvuva na Vashata sistema. Ediniiat ot nachinite da napravite tova e da
izpolzvate komandata grep vurhu faila s parolite /etc/passwd. Da predpolozhim,
che potrebitelskoto ime, koeto tursim e foobar:
xconsole$ grep "foobar" /etc/passwd
xconsole$
Niama nikakuv rezultat ot izpulnenieto. Tova oznachava che grep ne e namerila
suvpadenie. No mozhe da napravim programata mnogo po-polezna ako se poiaviava suobshtenie,
koeto poiasniava rezultata. Tova e, kogato iskate da proverite stoinosta, koiato
se vrushta ot dadena programa. Ima edna spetsialna promenliva, koiato sudurzha krainiia
rezultat ot izpulnenieto na programata. Tazi promenliva e $?.Razgledaite sledniia
kod:
#!/bin/bash
# grep for user foobar and pipe all output to /dev/null:
grep "foobar" /etc/passwd > /dev/null 2>&1
# capture the return value and act accordingly:
if [ "$?" -eq 0 ]; then
echo "Match found."
exit
else
echo "No match found."
fi
Kogato startirame programata, promenlivata "$?" shte prihvane rezultata ot komandata
grep. Ako toi e raven na 0, znachi ima suvpadenie i podhodiashto suobshtenie shte obiavi
za tova. V protiven sluchai shte izpechata, che niama suvpadeniia. Tova e edin osnoven
nachin za poluchavane na rezultata, koito vrushta dadena programa. SHTe otkriete,
che dosta chesto shte Vi se nalozhi da znaete stoinostta, koiato vrushta dadena programa,
za da produlzhite po-natatuk.
Ako sluchaino se chudite kakvo znachi 2>&1, sega shte vi obiasnia . Pod Linux, tezi
nomera oboznachavat failovi deskriptori. 0 e za standartniia vhod (primer: klaviatura),
1 e za standartniia izhod (primer: monitor) i 2 e za standartniia izhod na greshkite
(primer: monitor). Vsiaka obiknovena informatsiia se izprashta na failov deskriptor
1, i ako ima greshki te se izprashtat na failov deskriptor 2. Ako ne iskate tezi
suobshteniia da izlizat prosto mozhete da gi prenasochite kum /dev/null. Zabelezhete,
che tova niama da spre izprashtaneto na informatsiiata na standartniia izhod. Naprimer,
ako niamate prava da chetete ot direktoriia na drug potrebitel, Vie niama da mozhete
da vidite neinoto sudurzhanie:
xconsole$ ls /root
ls: /root: Permission denied
xconsole$ ls /root 2> /dev/null
xconsole$
Kakto vizhdate, suobshtenieto za greshka ne beshe izpechatano. Sushtoto vazhi kakto
za drugi programi, taka i za failov deskriptor 1. Ako ne iskate rezultatut ot
izpulnenieto na programata da se otpechatva na ekrana, mozhete spokoino da go
prenasochite kum /dev/null. Ako ne iskate da vizhdate kakto rezultatut ot izpulnenieto,
taka i suobshteniiata za greshka, mozhe da go napravite po sledniia nachin:
xconsole$ ls /root > /dev/null 2>&1
Tova oznachava che rezultatut ot programata, kakto i vsiaka greshka, koiato predizvika
tazi programa shte budat izprateni na /dev/null, taka che nikoga poveche niama da
mozhete da gi vidite.
Kakvo triabva da napravite ako iskate Vashiiat shel skript da vrushta stoinost pri
zavurshvane na programata? Komandata exit priema samo edin argument - chislo,
koeto triabva da se vurne pri zavurshvane na programata. Obiknovno chisloto 0 se
izpolzva, za da kazhem, che programata e zavurshila uspeshno, t.e. ne e vuzniknala
nikakva greshka po vreme na neinoto izpulnenie. Vsichko po-goliamo ili po-malko
ot 0 obiknoveno oboznachava, che e vuzniknala niakakva greshka. Tova go reshavate
Vie kato programist. Neka prosledim slednata programa:
#!/bin/bash
if [ -f "/etc/passwd" ]; then
echo "Password file exists."
exit 0
else
echo "No such file."
exit 1
fi
Zaklyuchenie
S tova zavurshihme uvoda v bash programiraneto. Tova rukovodstvo Vi dava osnovnite
znaniia, za da mozhete da redaktirate chuzhdi bash skriptove ili da suzdavate novi.
Za da postignete suvurshenstvo obache, triabva mnogo da praktikuvate. bash e idealno
sredstvo za pisane na obiknoveni administrativni skriptove. No za po-golemi
razrabotki shte se nuzhdaete ot moshtni ezitsi kato C ili Perl.
Uspeh!
X_console
Vizhte [ CHast 1| CHast 2 | CHast 3 | CHast 4 ]