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
2 ].
Kavichki
Kavichite igraiat goliama rolia v shel programiraneto. Ima tri razlichni vida: dvoini
kavichki: ", edinichna kavichka: ', i obratno naklonena kavichka:
`. Razlichavat li se te edna ot druga? - Da.
Obiknoveno izpolzvame dvoinata kavichka, za da oboznachim s neia niz ot simvoli
i da zapazim shpatsiiata. Naprimer, "Tozi niz sudurzha shpatsii.". Niz zagraden ot
dvoini kavichki se tretira kato edin argument. Vzemete sledniiat
skript za primer:
xconsole$ mkdir hello world
xconsole$ ls -F
hello/ world/
Suzdadohme dve direktorii. Komandata mkdir vze dumite hello i
world kato dva argumenta, suzdavaiki po tozi nachin dve direktorii. A
kakvo shte se sluchi sega:
xconsole$ mkdir "hello world"
xconsole$ ls -F
hello/ hello world/ world/
Suzdadohme edna direktoriia, sustoiashta se ot dve dumi. Dvoinite kavichki napraviha
komandata da tretira dvete dumi kato edin argument . Bez tiah mkdir shteshe
da prieme hello za purvi argument i world za vtori.
Edinichna kavichka se izpolzva obiknoveno, kogato se zanimavame s promenlivi.
Ako edna promenliva e zagradena ot dvoini kavichki, to neinata stoinost shte bude
otsenena. No tova niama da se sluchi ako izpolzvame edinichni kavichki. Za da vi
stane po-iasno razgledaite sledniiat primer:
#!/bin/bash
x=5 # stojnosta na x e 5
# izpolzwame dwojni kawichki
echo "Using double quotes, the value of x is: $x"
# izpolzwame edinichni kawichki
echo 'Using forward quotes, the value of x is: $x'
Vizhdate li razlikata? Mozhe da izpolzvate dvoini kavichki, ako ne smiatate da
slagate i promenlivi v niza, koito shte zagrazhdat kavichkite. Ako se chudite dali
edinichnite kavichki zapazvat shpatsiite v daden niz, kakto tova praviat dvoinite
kavichki, poglednete sledniia primer:
xconsole$ mkdir 'hello world'
xconsole$ ls -F
hello world/
Obratno naklonenite kavichki korenno se razlichavat ot dvoinite i edinichni kavichki.
Te ne se izpolzvat, za da zapazvat shpatsiite. Ako si spomniate po-rano izpolzvahme
sledniia red:
x=$(expr $x + 1)
Kakto veche znaete rezultatut ot komandata expr $x + 1 se prisvoiava na
promenlivata x. Sushtiiat tozi rezultat mozhe da bude postignat, ako izpolzvame
obratno nakloneni kavichki:
x=`expr $x + 1`
Koi ot nachinite da izpolzvate? Tozi, koito predpochitate. SHTe otkriete, che obratno
naklonenite kavichki sa po-chesto izpolzvani ot $(...). V mnogo sluchai
obache $(...) pravi koda po-lesen za chetene. Vzemete predvid tova:
$!/bin/bash
echo "I am `whoami`"
Aritmeticheski operatsii s BASH
bash vi pozvoliava da smiatate razlichni aritmetichni izrazi. Kakto veche
vidiahte, aritmeticheskite operatsii se izpolzvat posredstvom komandata expr.
Tazi komanda, obache, kakto i komandata true se smiata, che sa dosta bavni.
Prichinata za tova e, che shel interpretatorut triabva vseki put da startira true
i expr komandite, za da gi izpolzva. Kato alternativa na true
posochihme komandata ":". A kato alternativa na expr shte izpozvame
sledniia izraz $((...)). Razlikata sus $(...)
e broia na skobite.
Neka da opitame:
#!/bin/bash
x=8 # stojnosta na x e 8
y=4 # stojnosta na y e 4
# sega shte priswojm sumata na promenliwite x i y na promenliwata z:
z=$(($x + $y))
echo "Sum na $x + $y e $z"
Ako se chustvate po-komfortno s expr vmesto $((...)), togava go
izpolzvaite nego.
S bash mozhete da subirate, izvazhdate, umnozhavate, delite chisla, kakto
i da delite po modul. Eto i tehnite simvoli:
DEISTVIE OPERATOR
Subirane +
Izvazhdane -
Umnozhenie *
Delenie /
Delenie po modul %
Vseki ot Vas bi triabvalo da znae kakvo praviat purvite chetiri operatora. Ako
ne znaete kakvo oznachava delenie po modul - tova e ostatukut pri delenie na
dve stoinosti. Eto i malko bash aritmetika:
#!/bin/bash
x=5 # initialize x to 5
y=3 # initialize y to 3
add=$(($x + $y)) # sumiraj x sys y i priswoj rezultata na promenliwata add
sub=$(($x - $y)) # izwadi ot x y i priswoj rezultata na promenliwata sub
mul=$(($x * $y)) # umnozhi x po y i priswoj rezultata na promenliwata mul
div=$(($x / $y)) # razdeli x na y i priswoj rezultata na promenliwata div
mod=$(($x % $y)) # priswoj ostatyka pri delenie na x / y na promenliwata mod
# otpechataj otgoworite:
echo "Suma: $add"
echo "Razlika: $sub"
echo "Projzwedenie: $mul"
echo "Quotient: $div"
echo "Ostatyk: $mod"
Otnovo gorniiat kod mozheshe da bude nashisan s komandata expr. Naprimer
vmesto add=$(($x + $y)), shtiahme da pishem add=$(expr $x + $y), ili
add=`expr $x + $y`.
CHetene na informatsiia ot klaviaturata
Sega veche idvame kum interesnata chast. Vie mozhete da napravite Vashite programi
da si vzaimodeistvat s potrebitelia i potrebiteliat da mozhe da si vzaimodeistva
s programata. Komandata, koiato Vi pozvoliava da prochetete kakva stoinost v vuvel
potrebiteliat e read. read e vgradena v bash komanda, koiato
se izpolzva suvmestno s promenlivi, kakto shte vidite:
#!/bin/bash
# gets the name of the user and prints a greeting
echo -n "Enter your name: "
read user_name
echo "Hello $user_name!"
Promenlivata tuk e user_name. Razbira se, mozhe da ia narechete, kakto
si iskate. read shte Vi izchaka da vuvedeto neshto i da natisnete klavisha
ENTER. Ako ne natisnete nishto, komandata read shte chaka, dokato natisnete
ENTER . Ako ENTER e natisnat, bez da e vuvedeno neshto, to shte produlzhi izpulnenieto
na programata ot sledvashtiia red. Eto i primer:
#!/bin/bash
# gets the name of the user and prints a greeting
echo -n "Enter your name: "
read user_name
# the user did not enter anything:
if [ -z "$user_name" ]; then
echo "You did not tell me your name!"
exit
fi
echo "Hello $user_name!"
Ako potrebiteliat natisne samo klavisha ENTER, nashata programa shte se oplache i
shte prekrati izpulnenieto si. V protiven sluchai shte izpechata pozdravlenie. CHeteneto
na informatsiiata, koiato se vuvezhda ot klaviaturata e polezno, kogato pravite
interaktivni programi, koito iziskvat potrebiteliat da otgovori na konkretni
vuprosi.
Funktsii
Funktsiite praviat skripta po-lesen za poddurzhane. Nai-obshto kazano, funktsiite
razdeliat programaata na malki chasti. Funktsiite izpulniavat deistviia, koito Vie
ste definirali i mozhe da vurne stoinost ot izpulnenieto si ako zhelaete. Predi
da produlzhim, shte Vi pokazha edin primer na shel programa, koiato izpolzva funktsiia:
#!/bin/bash
# functiqta hello() samo izpechatwa syobshtenie
hello()
{
echo "Wie ste wyw funkciq hello()"
}
echo "Izwikwame funkciqta hello()..."
# izwikwame hello() funkciqta wytre w shell skripta:
hello
echo "Weche izleznahte ot funkciqta hello()"
Opitaite se da napishete tazi programa i da ia startirate. Edinstvenata tsel na
funktsiiata hello() e da izpechata suobshtenie. Funktsiite estestveno mogat
da izpulniavat i po-slozhni zadachi. V gorniia primer nie izvikahme funktsiiata hello()
s tozi red:
hello
Kogato se izpulniava tozi red bash interpretatorut pretursva skripta
za red, koito zapochva s hello(). Sled koeto otkriva tozi red i izpulniava
sudurzhanieto na funktsiiata.
Funktsiite vinagi se izvikvat chrez tiahnoto ime. Kogato pishete funktsiia, mozhete
da zapochnete funktsiiata s function_name(), kakto beshe napraveno v gorniia
primer, ili da izpolzvate dumata function t.e function function_name().
Drugiiat nachin, po koito mozhem da zapochnem nashata funktsiia e function
hello()
:
function hello()
{
echo "Wie ste wyw funkciq hello()"
}
Funktsiite vinagi zapochvat s otvariashta i zatvariashta skoba"()", posledvani
ot otvariashti i zatvariashti kudravi skobi: "{...}". Tezi kudravi skobi belezhat
nachaloto i kraia na funktsiiata. Vseki red s kod, zatvoren v tezi skobi shte bude
izpulnen i shte prinadlezhi edinstveno na funktsiiata. Funktsiite
triabva vinagi da budat definirani predi da budat izvikani. Neka poglednem nashata
programa, samo che tozi put shte izvikame funktsiiata predi da e definirana:
#!/bin/bash
echo "Izwikwame funkciqta hello()..."
# call the hello() function:
hello
echo "Weche izleznahte ot funkciqta hello()"
# function hello() just prints a message
hello()
{
echo "Wie ste wyw funkciq hello()"
}
Eto kakuv e rezultatut, kogato se opitame da izpulnim programata:
xconsole$ ./hello.sh
Izwikwame funkciqta hello()...
./hello.sh: hello: command not found
Weche izleznahte ot funkciqta hello()
Kakto vizhdate, programata vurna greshka. Eto zashto e dobre da pishete vashite funktsii
v nachaloto na skripta ili pone predi sa gi izvikate. Eto drug primer kak da
izpolzvame funktsii:
#!/bin/bash
# admin.sh - administrative tool
# function new_user() creates a new user account
new_user()
{
echo "Preparing to add a new user..."
sleep 2
adduser # run the adduser program
}
echo "1. Add user"
echo "2. Exit"
echo "Enter your choice: "
read choice
case $choice in
1) new_user # call the new_user() function
;;
*) exit
;;
esac
Za da raboti pravilno tazi programa triabva da ste vlezli kato root,
tui kato adduser e programa, koiato samo root potrebiteliat ima pravo da izpulniava.
Da se nadiavame, che tozi kratuk primer Vi e ubedil v poleznosta na fuktsiite.
Prihvashtane ne signali
Mozhe da izpolzvate vgradenata komanda trap< za da prihvashtate signali
vuv vashata programa. Tova e dobur nachin da izlezete normalno ot programata.
Naprimer, ako imate vurviashta programa pri natiskaneto na CTRL-C shte izpratite
na programata interrupt signal, koito shte "ubie" programata. trap;
shte vi pozvoli da prihvane tozi signal i shte vi dade vuzmozhnost ili da produlzhite
s izpulnenieto na programata, ili da suobshtite na potrebitelia, che programata
spira izpulnenieto si. trap ima sledniia sintaksis:
trap dejstwie signal
dejstwie ukazva kakvo da iskate da napravite, kogato prihvanete daden
signal, a signal e signalut, koito ochakvame. Spisuk sus signalite mozhe
da otkriete kato pishete trap -l. Kogato izpolzvate signali vuv Vashata
shel programa propusnete purvite tri bukvi na signala, obiknoveno te sa SIG.
Naprimer, ako signalut za prekusvane e SIGINT, vuv Vashata shel programa
izpolzvaite samo INT. Mozhete da izpolzvate i nomera na signala. Nomerut
na signala SIGINT e 2. Probvaite slednata programa:
#!/bin/bash
# using the trap command
# da se zipylni funkciqta sorry() pri natiskane na CTRL-C:
trap sorry INT
# function sorry() prints a message
sorry()
{
echo "I'm sorry Dave. I can't do that."
sleep 3
}
# count down from 10 to 1:
for i in 10 9 8 7 6 5 4 3 2 1; do
echo $i seconds until system failure."
sleep 1
done
echo "System failure."
Sega, dokato programata vurvi i broi chisla v obraten red, natisnete CTRL-C.
Tova shte izprati signal za prekusvane na programata. Signalut shte bude prihvanat
ot trap komandata, koiato shte izpulni sorry() funktsiiata. Mozhete
da nakarate trap da ignorira signal kato postavite "''" na miastoto
na deistvie. Mozhete da nakarate trap da ne prihvashta signal kato
izpolzvate "-". Naprimer:
# izpylni sorry() funkciqta kogato programa poluchi signal SIGINT:
trap sorry INT
# nakaraj programata da NE prihwashta SIGINT signala :
trap - INT
# ne prawi nishto kogato se prihwane signal SIGINT:
trap '' INT
Kogato kazhete na trap da ne prihvashta signala, to programata se podchiniava
na osnovnoto deistvie na signal, koeto v konkretniia sluchai e da prekusne programata
i da ia "ubie". Kogato ukazhete trap da ne pravi nishto pri poluchavane na
konkreten signal, to programata shte produlzhi svoeto deistvie, ignoriraiki signala.
Vizhte [ CHast
1| CHast
2 | CHast 3 | CHast
4 ]
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
2 ].
Kavichki
Kavichite igraiat goliama rolia v shel programiraneto. Ima tri razlichni vida: dvoini
kavichki: ", edinichna kavichka: ', i obratno naklonena kavichka:
`. Razlichavat li se te edna ot druga? Da.
Obiknoveno izpolzvame dvoinata kavichka, za da oboznachim s neia niz ot simvoli
i da zapazim shpatsiiata. Naprimer, "Tozi niz sudurzha shpatsii.". Niz zagraden ot
dvoini kavichki se tretira kato edin argument. Vzemete sledniia
skript za primer:
xconsole$ mkdir hello world
xconsole$ ls -F
hello/ world/
Suzdadohme dve direktorii. Komandata mkdir vze dumite hello i
world kato dva argumenta, suzdavaiki po tozi nachin dve direktorii. A
kakvo shte se sluchi sega:
xconsole$ mkdir "hello world"
xconsole$ ls -F
hello/ hello world/ world/
Suzdadohme edna direktoriia, sustoiashta se ot dve dumi. Dvoinite kavichki napraviha
komandata da tretira dvete dumi kato edin argument . Bez tiah mkdir shteshe
da prieme hello za purvi argument i world za vtori.
Edinichna kavichka se izpolzva obiknoveno, kogato se zanimavame s promenlivi.
Ako edna promenliva e zagradena ot dvoini kavichki, to neinata stoinost shte bude
otsenena. No tova niama da se sluchi ako izpolzvame edinichni kavichki. Za da Vi
stane po-iasno razgledaite sledniia primer:
#!/bin/bash
x=5 # stojnosta na x e 5
# izpolzwame dwojni kawichki
echo "Using double quotes, the value of x is: $x"
# izpolzwame edinichni kawichki
echo 'Using forward quotes, the value of x is: $x'
Vizhdate li razlikata? Mozhe da izpolzvate dvoini kavichki, ako ne smiatate da
slagate i promenlivi v niza, koito shte zagrazhdat kavichkite. Ako se chudite dali
edinichnite kavichki zapazvat shpatsiite v daden niz, kakto tova praviat dvoinite
kavichki, poglednete sledniia primer:
xconsole$ mkdir 'hello world'
xconsole$ ls -F
hello world/
Obratno naklonenite kavichki korenno se razlichavat ot dvoinite i edinichni kavichki.
Te ne se izpolzvat, za da zapazvat shpatsiite. Ako si spomniate po-rano izpolzvahme
sledniia red:
x=$(expr $x + 1)
Kakto veche znaete, rezultatut ot komandata expr $x + 1 se prisvoiava
na promenlivata x. Sushtiiat tozi rezultat mozhe da bude postignat ako izpolzvame
obratno nakloneni kavichki:
x=`expr $x + 1`
Koi ot nachinite da izpolzvate? Tozi, koito predpochitate. SHTe otkriete, che obratno
naklonenite kavichki sa po-chesto izpolzvani ot $(...). V mnogo sluchai
obache $(...) pravi koda po-lesen za chetene. Vzemete predvid tova:
$!/bin/bash
echo "I am `whoami`"
Aritmeticheski operatsii s BASH
bash vi pozvoliava da smiatate razlichni aritmetichni izrazi. Kakto veche
vidiahte aritmeticheskite operatsii se izpolzvat posredstvom komandata expr.
Tazi komanda, obache, kakto i komandata true se smiata, che sa dosta bavni.
Prichinata za tova e, che shel interpretatorut triabva vseki put da startira true
i expr komandite, za da gi izpolzva. Kato alternativa na true
posochihme komandata ":". A kato alternativa na expr shte izpozvame
sledniia izraz $((...)). Razlikata sus $(...)
e broiat na
skobite. Neka da opitame:
#!/bin/bash
x=8 # stojnosta na x e 8
y=4 # stojnosta na y e 4
# sega shte priswojm sumata na promenliwite x i y na promenliwata z:
z=$(($x + $y))
echo "Sum na $x + $y e $z"
Ako se chustvate po-komfortno s expr vmesto $((...)), togava go
izpolzvaite nego.
S bash mozhete da subirate, izvazhdate, umnozhavate, delite chisla, kakto
i da delite po modul. Eto i tehnite simvoli:
DEISTVIE OPERATOR
Subirane +
Izvazhdane -
Umnozhenie *
Delenie /
Delenie po modul %
Vseki ot Vas bi triabvalo da znae kakvo praviat purvite chetiri operatora. Ako
ne znaete kakvo oznachava delenie po modul tova e ostatukut pri delenie na dve
stoinosti. Eto i malko bash aritmetika:
#!/bin/bash
x=5 # initialize x to 5
y=3 # initialize y to 3
add=$(($x + $y)) # sumiraj x sys y i priswoj rezultata na promenliwata add
sub=$(($x - $y)) # izwadi ot x y i priswoj rezultata na promenliwata sub
mul=$(($x * $y)) # umnozhi x po y i priswoj rezultata na promenliwata mul
div=$(($x / $y)) # razdeli x na y i priswoj rezultata na promenliwata div
mod=$(($x % $y)) # priswoj ostatyka pri delenie na x / y na promenliwata mod
# otpechataj otgoworite:
echo "Suma: $add"
echo "Razlika: $sub"
echo "Projzwedenie: $mul"
echo "Quotient: $div"
echo "Ostatyk: $mod"
Otnovo gorniiat kod mozheshe da bude nashisan s komandata expr. Naprimer
vmesto add=$(($x + $y)), shtiahme da pishem add=$(expr $x + $y), ili
add=`expr $x + $y`.
CHetene na informatsiia ot klaviaturata
Sega veche idvame kum interesnata chast. Vie mozhete da napravite Vashite programi
da si vzaimodeistvat s potrebitelia i potrebiteliat da mozhe da si vzaimodeistva
s programata. Komandata koiato Vi pozvoliava da prochetete kakva stoinost v vuvel
potrebiteliat e read. read e vgradena v bash komanda, koiato
se izpolzva suvmestno s promenlivi, kakto shte vidite:
#!/bin/bash
# gets the name of the user and prints a greeting
echo -n "Enter your name: "
read user_name
echo "Hello $user_name!"
Promenlivata tuk e user_name. Razbira se, mozhe da ia narechete, kakto
si iskate. read shte vi izchaka da vuvedeto neshto i da natisnete klavisha
ENTER. Ako ne natisnete nishto, komandata read shte chaka, dokato natisnete
ENTER . Ako ENTER e natisnat, bez da e vuvedeno neshto, to shte produlzhi izpulnenieto
na programata ot sledvashtiia red. Eto i primer:
#!/bin/bash
# gets the name of the user and prints a greeting
echo -n "Enter your name: "
read user_name
# the user did not enter anything:
if [ -z "$user_name" ]; then
echo "You did not tell me your name!"
exit
fi
echo "Hello $user_name!"
Ako potrebiteliat natisne samo klavisha ENTER, nashata programa shte se oplache i
shte prekrati izpulnenieto si. V protiven sluchai shte izpechata pozdravlenie. CHeteneto
na informatsiiata, koiato se vuvezhda ot klaviaturata e polezno, kogato pravite
interaktivni programi, koito iziskvat potrebiteliat da otgovori na konkretni
vuprosi.
Funktsii
Funktsiite praviat skripta po-lesen za poddurzhane. Nai-obshto kazano, funktsiite
razdeliat programata na malki chasti. Funktsiite izpulniavat deistviia, koito Vie
ste definirali i mozhe da vurne stoinost ot izpulnenieto si ako zhelaete. Predi
da produlzhim, shte Vi pokazha edin primer na shel programa, koiato izpolzva funktsiia:
#!/bin/bash
# functiqta hello() samo izpechatwa syobshtenie
hello()
{
echo "Wie ste wyw funkciq hello()"
}
echo "Izwikwame funkciqta hello()..."
# izwikwame hello() funkciqta wytre w shell skripta:
hello
echo "Weche izleznahte ot funkciqta hello()"
Opitaite se da napishete tazi programa i da ia startirate. Edinstvenata tsel na
funktsiiata hello() e da izpechata suobshtenie. Funktsiite estestveno mogat
da izpulniavat i po-slozhni zadachi. V gorniia primer nie izvikahme funktsiiata hello()
s tozi red:
hello
Kogato se izpulniava tozi red bash interpretatora pretursva skripta za
red koito zapochva s hello(). Sled koeto otkriva tozi red i izpulniava
sudurzhanieto na funktsiiata.
Funktsiite vinagi se izvikvat chrez tiahnoto ime. Kogato pishete funktsiia mozhete
da zapochnete funktsiiata s function_name(), kakto beshe napraveno v gorniia
primer, ili da izpolzvate dumata function t.e function function_name().
Drugiiat nachin, po koito mozhem da zapochnem nashata funktsiia e function
hello()
:
function hello()
{
echo "Wie ste wyw funkciq hello()"
}
Funktsiite vinagi zapochvat s otvariashta i zatvariashta skoba"()", posledvani
ot otvariashti i zatvariashti kudravi skobi: "{...}". Tezi kudravi skobi belezhat
nachaloto i kraia na funktsiiata. Vseki red s kod zatvoren v tezi skobi shte bude
izpulnen i shte prinadlezhi edinstveno na funktsiiata. Funktsiite
triabva vinagi da budat definirani predi da budat izvikani. Neka poglednem nashata
programa, samo che tozi put shte izvikame funktsiiata predi da e definirana:
#!/bin/bash
echo "Izwikwame funkciqta hello()..."
# call the hello() function:
hello
echo "Weche izleznahte ot funkciqta hello()"
# function hello() just prints a message
hello()
{
echo "Wie ste wyw funkciq hello()"
}
Eto kakuv e rezultatut, kogato se opitame da izpulnim programata:
xconsole$ ./hello.sh
Izwikwame funkciqta hello()...
./hello.sh: hello: command not found
Weche izleznahte ot funkciqta hello()
Kakto vizhdate, programata vurna greshka. Eto zashto e dobre da pishete Vashite funktsii
v nachaloto na skripta ili pone predi si gi izvikate. Eto drug primer kak da
izpolzvame funktsii:
#!/bin/bash
# admin.sh - administrative tool
# function new_user() creates a new user account
new_user()
{
echo "Preparing to add a new user..."
sleep 2
adduser # run the adduser program
}
echo "1. Add user"
echo "2. Exit"
echo "Enter your choice: "
read choice
case $choice in
1) new_user # call the new_user() function
;;
*) exit
;;
esac
Za da raboti pravilno tazi programa, triabva da ste vlezli kato root,
tui kato adduser e programa, koiato samo root potrebiteliat ima pravo da izpulniava.
Da se nadiavame, che tozi kratuk primer Vi e ubedil v poleznosta na fuktsiite.
Prihvashtane na signali
Mozhe da izpolzvate vgradenata komanda trap, za da prihvashtate signali
vuv Vashata programa. Tova e dobur nachin da izlezete normalno ot programata.
Neprimer, ako imate vurviashta programa pri natiskaneto na CTRL-C shte izpratite
na programata interrupt signal, koito shte "ubie" programata. trap
shte Vi pozvoli da prihvane tozi signal i shte Vi dade vuzmozhnost ili da produlzhite
s izpulnenieto na programata, ili da suobshtite na potrebitelia, che programata
spira izpulnenieto si. trap ima sledniia sintaksis:
trap dejstwie signal
dejstwie ukazva kakvo da iskate da napravite, kogato prihvanete daden
signal, a signal e signalut, koito ochakvame. Spisuk sus signalite mozhe
da otkriete kato pishete trap -l. Kogato izpolzvate signali vuv vashata
shel programa propusnete purvite tri bukvi na signala, obiknoveno te sa SIG.
Naprimer, ako signalut za prekusvane e SIGINT, vuv Vashata shel programa
izpolzvaite samo INT. Mozhete da izpolzvate i nomera na signala. Nomerut
na signala SIGINT e 2. Probvaite slednata programa:
#!/bin/bash
# using the trap command
# da se zipylni funkciqta sorry() pri natiskane na CTRL-C:
trap sorry INT
# function sorry() prints a message
sorry()
{
echo "I'm sorry Dave. I can't do that."
sleep 3
}
# count down from 10 to 1:
for i in 10 9 8 7 6 5 4 3 2 1; do
echo $i seconds until system failure."
sleep 1
done
echo "System failure."
Sega, dokato programata vurvi i broi chisla v obraten red natisnete CTRL-C.
Tova shte izprati signal za prekusvane na programata. Signalut shte bude prihvanat
ot trap komandata, koiato shte izpulni sorry() funktsiiata. Mozhete
da nakarate trap da ignorira signal kato postavite "''" na miastoto
na deistvie. Mozhete da nakarate trap da ne prihvashta signal kato
izpolzvate "-". Naprimer:
# izpylni sorry() funkciqta kogato programa poluchi signal SIGINT:
trap sorry INT
# nakaraj programata da NE prihwashta SIGINT signala :
trap - INT
# ne prawi nishto kogato se prihwane signal SIGINT:
trap '' INT
Kogato kazhete na trap da ne prihvashta signala, to programata se podchiniava
na osnovnoto deistvie na signal, koeto v konkretniia sluchai e da prekusne programata
i da ia "ubie". Kogato ukazhete trap da ne pravi nishto pri poluchavane na
konkreten signal, to programata shte produlzhi svoeto deistvie, ignoriraiki signala.
Vizhte [ CHast
1| CHast
2 | CHast 3 | CHast
4 ]