“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.

  1. Kody gaýtadan ulanmaga kömek edýär.
  2. Programmanyň okalmagyny gowulandyrmak.
  3. Programmanyň içindäki üýtgeýänleri netijeli ulanmak.
  4. Programmanyň böleklerini barlamaga mümkinçilik berýär.
  5. 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üň.

  1. Linux Shell skript ýazuw diliniň esasy maslahatlaryna düşüniň - I bölüm
  2. Shell programmirlemesini öwrenmek üçin Linux täze doglan çagalar üçin 5 sany gabyk skripti - II bölüm
  3. Linux BASH skriptiniň dünýäsinde ýüzmek - III bölüm
  4. Linux Shell programmirlemegiň matematiki tarapy - IV bölüm
  5. 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ň.