Izpratnes un rakstīšanas funkcijas čaulas skriptos - VI daļa
Funkcijām ir svarīga loma jebkurā programmēšanas valodā. Tāpat kā daudzām reālām programmēšanas valodām, bash ir funkcijas, kuras tiek izmantotas ar ierobežotu ieviešanu.
Kas ir funkcijas?
Programmēšanā funkcijas tiek dēvētas par programmas sadaļām, kas veic noteiktu uzdevumu. Šajā ziņā funkcija ir procedūras vai rutīnas veids. Kad funkciju sauc, programma atstāj pašreizējo koda sadaļu un sāk izpildīt pirmo rindu funkcijas iekšpusē. Ikreiz, kad ir atkārtots kods vai kad uzdevums atkārtojas, apsveriet iespēju izmantot funkciju.
Piemēram, ņemiet vērā gadījumu, kad mums jāatrod skaitļa faktoriāls vairākos konkrētas programmas posmos. Tā vietā, lai katru reizi uzrakstītu visu kodu (faktoriāla aprēķināšanai), mēs varam uzrakstīt to koda daļu, kas aprēķina faktoriālu vienreiz blokā un atkārtoti to pašu izmantot vairākkārt.
- Tas palīdz mums atkārtoti izmantot kodu.
- Uzlabojiet programmas lasāmību.
- Efektīva mainīgo izmantošana programmas iekšienē.
- ļauj mums pārbaudīt programmas daļu pa daļām.
- Programma tiek parādīta kā virkne apakšpasākumu.
Funkciju rakstīšanas čaulas skriptā vispārējā sintakse ietver šādus veidus.
function func_name { . . . commands . . . } or func_name ( ) { . . . commands . . . } Opening curly braces can also be used in the second line as well. func_name ( ) { . . . commands . . . }
Šajos funkciju blokos jūs vienmēr varat rakstīt derīgas komandas, kā mēs parasti darām čaulas skriptos. Tagad mēģināsim uzrakstīt vienu vienkāršu skriptu ar nelielu funkciju tajā.
#!/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
Funkcijas definīcijai jābūt pirms pirmā izsaukuma uz to. Pirms izsaukšanas nekas nav tāds, kā “deklarēt funkciju”. Mēs vienmēr varam ligzdot funkcijas funkciju iekšpusē.
Piezīme: - Tukšu funkciju rakstīšana vienmēr rada sintakses kļūdas.
Kad viena un tā pati funkcija tiek definēta vairākas reizes, tiek izsaukta galīgā versija. Ņemsim piemēru.
#!/bin/bash func_same ( ) { echo ‘First definition’ } func_same ( ) { echo ‘Second definition’ } func_same exit 0
Padziļināsimies, apsverot funkcijas, kas ņem parametrus un atgriež vērtības. Lai atgrieztu vērtību no funkcijas, mēs izmantojam iebūvēto čaulu ‘return’. Sintakse ir šāda.
func_name ( ) { . . . commands . . . return $ret_val }
Līdzīgi mēs varam nodot argumentus funkcijām, kas atdalītas ar atstarpēm, kā norādīts zemāk.
func_name $arg_1 $arg_2 $arg_3
Funkcijas iekšpusē mēs varam piekļūt argumentiem tādā secībā kā $1, $2, $3 un tā tālāk. Apskatiet šo skripta piemēru, lai atrastu ne vairāk kā divus veselos skaitļus, izmantojot funkciju, lai pievienotu lielāku skaidrību.
#!/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
Iepriekš minētais izskatās mazliet sarežģīts, taču tas ir vienkārši, ja mēs lasām caur rindām. Vispirms ligzdo if-else if rindas validācijas nolūkos, t.i., lai pārbaudītu argumentu skaitu un veidu, izmantojot regulāras izteiksmes. Pēc tam mēs izsaucam funkciju ar diviem komandrindas argumentiem un tur parādām rezultātu. Tas ir tāpēc, ka mēs nevaram atgriezt lielus veselus skaitļus no funkcijas. Vēl viens veids, kā novērst šo problēmu, ir globālo mainīgo izmantošana, lai rezultātu saglabātu funkcijas iekšpusē. Zemāk esošais skripts izskaidro šo metodi.
#!/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
Tagad izmēģiniet dažas aizraujošas problēmas, kas tika izskaidrotas iepriekšējā čaulas skriptu sērijā, izmantojot šādas funkcijas.
- Izprotiet pamata Linux čaulas skriptu valodas padomus - I daļa
- 5 čaulas skripti iesācējiem Linux, lai uzzinātu čaulas programmēšanu - II daļa
- Burāšana caur Linux BASH skriptu pasauli - III daļa
- Linux čaulas programmēšanas matemātiskais aspekts - IV daļa
- Matemātisko izteiksmju aprēķināšana čaulas skriptu valodā - V daļa
Nākamajā daļā es atgriezīšos ar lielāku ieskatu par funkcionālajām funkcijām, piemēram, vietējo mainīgo izmantošanu, rekursiju utt. Esiet informēts par komentāriem.