ot X_console(4-05-2000)

reiting (15)   [ 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 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 ]



<< Instalirane na zvukova karta ruchno(po-spets. Yamaha 719) | Pisane na skriptove za BASH shel : versiia 1.2( chast 2) >>