„Shell Scripts“ funkcijų supratimas ir rašymas – VI dalis
Funkcijos vaidina svarbų vaidmenį bet kurioje programavimo kalboje. Kaip ir daugelis tikrų programavimo kalbų, bash turi funkcijų, kurios naudojamos su ribotu įgyvendinimu.
Kas yra funkcijos?
Programavime funkcijos įvardijamos tam tikrą užduotį atliekančios programos dalys. Šia prasme funkcija yra tam tikros rūšies procedūra arba rutina. Kai funkcija iškviečiama, programa palieka dabartinę kodo dalį ir pradeda vykdyti pirmąją eilutę funkcijos viduje. Kai yra pasikartojantis kodas arba kai užduotis kartojasi, apsvarstykite galimybę vietoj jos naudoti funkciją.
Pavyzdžiui, apsvarstykite atvejį, kai mums reikia rasti skaičiaus faktorialą keliuose konkrečios programos etapuose. Užuot rašę visą kodą (faktorialui apskaičiuoti) kiekvieną kartą, galime parašyti tą kodo dalį, kuri apskaičiuoja faktorialą vieną kartą bloke ir pakartotinai panaudoti tą patį kelis kartus.
Kodėl rašome funkcijas?
- Tai padeda mums pakartotinai naudoti kodą.
- Pagerinkite programos skaitomumą.
- Efektyvus kintamųjų naudojimas programos viduje.
- Leidžia išbandyti programą po dalies.
- Rodo programą kaip papildomų veiksmų rinkinį.
Funkcijos apvalkalo scenarijuose
Bendroji funkcijų rašymo į apvalkalo scenarijų sintaksė apima šiuos būdus.
function func_name {
. . .
commands
. . .
}
or
func_name ( ) {
. . .
commands
. . .
}
Opening curly braces can also be used in the second line as well.
func_name ( )
{
. . .
commands
. . .
}
Jūs visada galite laisvai rašyti tinkamas komandas šiuose funkciniuose blokuose, kaip įprastai darome apvalkalo scenarijuose. Dabar pabandykime parašyti vieną paprastą scenarijų su maža funkcija.
#!/bin/bash
call_echo ( ) {
echo ‘This is inside function’
}
op=$1
if [ $# -ne 1 ]; then
echo "Usage: $0 <1/0>"
else
if [ $1 = 0 ] ; then
echo ‘This is outside function’
elif [ $1 = 1 ] ; then
call_echo
else
echo ‘Invalid argument’
fi
fi
exit 0
Funkcijos apibrėžimas turi būti prieš pirmąjį jos iškvietimą. Nėra nieko panašaus į funkciją „deklaruoti funkciją“ prieš ją iškviečiant. Ir visada galime sudėti funkcijas funkcijų viduje.
Pastaba: rašant tuščias funkcijas visada atsiranda sintaksės klaidų.
Kai ta pati funkcija apibrėžiama kelis kartus, iškviečiama galutinė versija. Paimkime pavyzdį.
#!/bin/bash
func_same ( ) {
echo ‘First definition’
}
func_same ( ) {
echo ‘Second definition’
}
func_same
exit 0
Funkcijos, paimančios parametrus ir grąžinančios reikšmes
Pažvelkime giliau, apsvarstydami funkcijas, kurios ima parametrus ir grąžina reikšmes. Norėdami grąžinti reikšmę iš funkcijos, naudojame įmontuotą apvalkalą „grįžti“. Sintaksė yra tokia.
func_name ( ) {
. . .
commands
. . .
return $ret_val
}
Panašiai galime perduoti argumentus funkcijoms, atskirtoms tarpais, kaip nurodyta toliau.
func_name $arg_1 $arg_2 $arg_3
Funkcijos viduje galime pasiekti argumentus tokia tvarka kaip $1, $2, $3 ir pan. Pažvelkite į šį scenarijaus pavyzdį, kad surastumėte daugiausiai du sveikuosius skaičius naudodami funkciją, kad padidintumėte aiškumą.
#!/bin/bash
USG_ERR=7
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
echo $1
else
echo $2
fi
}
err_str ( ) {
echo "Usage: $0 <number1> <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
x
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then
max_two $NUM_1 $NUM_2
else
err_str
fi
else
err_str
fi
exit 0
Tai, kas išdėstyta pirmiau, atrodo šiek tiek sudėtinga, bet tai paprasta, jei perskaitome eilutes. Pirmiausia įdėtos jei-else if eilutės patvirtinimo tikslais, ty patikrinti argumentų skaičių ir tipą naudojant reguliariąsias išraiškas. Po to mes iškviečiame funkciją su dviem komandinės eilutės argumentais ir parodome rezultatą. Taip yra todėl, kad iš funkcijos negalime grąžinti didelių sveikųjų skaičių. Kitas būdas išspręsti šią problemą yra naudoti visuotinius kintamuosius, kad būtų išsaugotas rezultatas funkcijos viduje. Toliau pateiktame scenarijuje paaiškinamas šis metodas.
#!/bin/bash
USG_ERR=7
ret_val=
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
ret_val=$1
else
ret_val=$2
fi
}
err_str ( ) {
echo "Usage: $0 <number1> <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then
max_two $NUM_1 $NUM_2
echo $ret_val
else
err_str
fi
else
err_str
fi
exit 0
Dabar išbandykite keletą įdomių problemų, kurios buvo paaiškintos ankstesnėje apvalkalo scenarijų serijoje, naudodami toliau nurodytas funkcijas.
- Supraskite pagrindinius „Linux Shell“ scenarijų kalbos patarimus – I dalis
- 5 apvalkalo scenarijai, skirti Linux naujokams mokytis apvalkalo programavimo – II dalis
- Plaukimas per Linux BASH scenarijų pasaulį – III dalis
- Matematinis Linux apvalkalo programavimo aspektas – IV dalis
- Matematinių išraiškų skaičiavimas Shell skriptų kalba – V dalis
Kitoje dalyje pateiksiu daugiau įžvalgų apie funkcines funkcijas, tokias kaip vietinių kintamųjų naudojimas, rekursija ir kt. Sekite naujienas su komentarais.