“Shell Script” -däki funksiýalara düşünmek we ýazmak - VI bölüm
Funksiýalar islendik programmirleme dilinde möhüm rol oýnaýar. Hakyky programmirleme dilleriniň köpüsi ýaly, başyň çäkli ýerine ýetirilmegi bilen ulanylýan funksiýalary bar.
Funksiýalar näme?
Programmirlemekde, funksiýalara belli bir işi ýerine ýetirýän bölümler diýilýär. Bu nukdaýnazardan, funksiýa proseduranyň ýa-da adaty bir görnüşdir. Haçan-da bir funksiýa diýlende, programma häzirki kod bölümini taşlap, funksiýanyň içindäki birinji setiri ýerine ýetirip başlaýar. Haçan-da gaýtalanýan kod bar bolsa ýa-da bir mesele gaýtalansa, ýerine bir funksiýa ulanmagy göz öňünde tutuň.
Mysal üçin, belli bir programmanyň birnäçe tapgyrynda san faktoryny tapmaly ýerimize serediň. Codehli kody ýazmagyň ýerine (faktory hasaplamak üçin) her gezek bir blokyň içinde faktory hasaplaýan we şol bir wagtyň özünde şol bir zady gaýtadan ulanýan kod bölegini ýazyp bileris.
- Kody gaýtadan ulanmaga kömek edýär.
- Programmanyň okalmagyny gowulandyrmak.
- Programmanyň içindäki üýtgeýänleri netijeli ulanmak.
- Programmanyň böleklerini barlamaga mümkinçilik berýär.
- Programmany bir topar kiçi ädim hökmünde görkezýär.
Gabyk skriptinde ýazmak funksiýalarynyň umumy sintaksisi aşakdaky usullary öz içine alýar.
function func_name { . . . commands . . . } or func_name ( ) { . . . commands . . . } Opening curly braces can also be used in the second line as well. func_name ( ) { . . . commands . . . }
Elmydama gabyk skriptlerinde edişimiz ýaly bu funksiýa bloklarynyň içinde dogry buýruklary ýazyp bilersiňiz. Indi içindäki kiçijik funksiýa bilen bir ýönekeý skript ýazmaga synanyşalyň.
#!/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
Funksiýa kesgitlemesi, oňa ilkinji jaňdan öň bolmaly. Çagyrylmazdan ozal funksiýany yglan etmek ýaly zat ýok. We funksiýalaryň içinde hemişe höwürtge döredip bileris.
Bellik: - Boş funksiýalary ýazmak elmydama sintaksis ýalňyşlyklaryna sebäp bolýar.
Şol bir funksiýa birnäçe gezek kesgitlenende, iň soňky wersiýa çagyrylýar. Mysal alalyň.
#!/bin/bash func_same ( ) { echo ‘First definition’ } func_same ( ) { echo ‘Second definition’ } func_same exit 0
Parametrleri alyp, bahalary yzyna gaýtarmak bilen has çuňlaşalyň. Funksiýadan bahany yzyna gaýtarmak üçin gurlan “gaýdyp” gabygyny ulanýarys. Sintaksis aşakdaky ýaly.
func_name ( ) { . . . commands . . . return $ret_val }
Şonuň ýaly-da, aşakda görkezilişi ýaly boşluklar bilen bölünen funksiýalara argumentler berip bileris.
func_name $arg_1 $arg_2 $arg_3
Funksiýanyň içinde argumentlere $1, $2, $3 we ş.m. girip bileris. Has düşnükli bolmak üçin funksiýany ulanyp, iň köp iki sany bitewi san tapmak üçin aşakdaky mysal skriptine serediň.
#!/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
Aboveokardakylar birneme çylşyrymly ýaly görünýär, ýöne setirleri okasak ýönekeý. Ilki bilen tassyklamak maksady bilen setirler, ýagny yzygiderli aňlatmalaryň kömegi bilen argumentleriň sanyny we görnüşini barlamak üçin höwürtge döredýär. Ondan soň iki buýruk setiri argumenti bilen funksiýa diýýäris we netijäni şol ýerde görkezýäris. Sebäbi bir funksiýadan uly bitewi sanlary yzyna gaýtaryp bilmeris. Bu meseläniň üstünde işlemegiň ýene bir usuly, netijäni içerki funksiýada saklamak üçin global üýtgeýänleri ulanmakdyr. Aşakdaky ýazgy bu usuly düşündirýär.
#!/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
Indi aşakdaky funksiýalary ulanyp, öňki gabyk skript seriýasynda düşündirilen käbir gyzykly meseleleri synap görüň.
- Linux Shell skript ýazuw diliniň esasy maslahatlaryna düşüniň - I bölüm
- Shell programmirlemesini öwrenmek üçin Linux täze doglan çagalar üçin 5 sany gabyk skripti - II bölüm
- Linux BASH skriptiniň dünýäsinde ýüzmek - III bölüm
- Linux Shell programmirlemegiň matematiki tarapy - IV bölüm
- Gabyk skript dilinde matematiki aňlatmalary hasaplamak - V bölüm
Indiki bölümde ýerli üýtgeýjileri ulanmak, gaýtalanma we ş.m. ýaly funksional aýratynlyklara has köp düşünerin. Teswirler bilen täzelenip duruň.