ot X_console(6-06-2000)

reiting (30)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

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 ]



<< Kirilizirane na Linux | (Ne)sigurnost s Apache Web Server >>