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.

  1. Tas palīdz mums atkārtoti izmantot kodu.
  2. Uzlabojiet programmas lasāmību.
  3. Efektīva mainīgo izmantošana programmas iekšienē.
  4. ļauj mums pārbaudīt programmas daļu pa daļām.
  5. 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.

  1. Izprotiet pamata Linux čaulas skriptu valodas padomus - I daļa
  2. 5 čaulas skripti iesācējiem Linux, lai uzzinātu čaulas programmēšanu - II daļa
  3. Burāšana caur Linux BASH skriptu pasauli - III daļa
  4. Linux čaulas programmēšanas matemātiskais aspekts - IV daļa
  5. 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.