Skilningur og ritunaraðgerðir í Shell Scripts - Hluti VI


Aðgerðir gegna mikilvægu hlutverki í hvaða forritunarmáli sem er. Eins og mörg raunveruleg forritunarmál, hefur bash aðgerðir sem eru notaðar með takmarkaðri útfærslu.

Hvað eru aðgerðir?

Í forritun eru aðgerðir nefndir hlutar forrits sem framkvæmir ákveðið verkefni. Í þessum skilningi er aðgerð eins konar aðferð eða venja. Þegar fall er kallað yfirgefur forritið núverandi hluta kóðans og byrjar að framkvæma fyrstu línuna í fallinu. Alltaf þegar það er endurtekinn kóða eða þegar verkefni er endurtekið skaltu íhuga að nota aðgerð í staðinn.

Skoðaðu til dæmis tilvikið þar sem við þurfum að finna þáttatölu á nokkrum stigum tiltekins forrits. Í stað þess að skrifa allan kóðann (til að reikna út þáttagildið) í hvert skipti, getum við skrifað þann hluta kóðans sem reiknar þáttinn einu sinni inni í blokk og endurnýtt það sama við mörg tækifæri.

  1. Það hjálpar okkur að endurnýta kóðann.
  2. Bættu læsileika forritsins.
  3. Skilvirk notkun á breytum innan forritsins.
  4. Leyfir okkur að prófa forritið hluta fyrir hluta.
  5. Sýnir forrit sem fullt af undirskrefum.

Almenn setningafræði til að skrifa aðgerðir í skeljaskriftu inniheldur eftirfarandi leiðir.

function func_name {
	. . .
	commands
	. . .
}

or

func_name ( ) {
	. . .
	commands
	. . .
}

Opening curly braces can also be used in the second line as well.

func_name ( )
{
	. . .
	commands
	. . .
}

Þér er alltaf frjálst að skrifa gildar skipanir inni í þessum aðgerðarblokkum eins og við gerum venjulega í skeljaforskriftum. Nú skulum við reyna að skrifa eitt einfalt handrit með lítilli aðgerð inni í því.

#!/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

Fallskilgreiningin verður að vera á undan fyrsta kalli til hennar. Það er ekkert eins og að „lýsa yfir aðgerðinni“ áður en þú hringir í hana. Og við getum alltaf hreiðrað aðgerðir inni í aðgerðum.

Athugið: - Að skrifa tómar aðgerðir leiðir alltaf til setningafræðivillna.

Þegar sama aðgerðin er skilgreind mörgum sinnum er lokaútgáfan það sem er kallað fram. Tökum dæmi.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0

Við skulum komast dýpra með því að íhuga aðgerðir sem taka færibreytur og skila gildum. Til að skila gildi úr falli notum við innbyggða ‘aftur’ skelina. Setningafræði er sem hér segir.

func_name ( ) {
	. . .
	commands
	. . .
	return $ret_val
}

Á sama hátt getum við sent rök til aðgerðanna sem eru aðskilin með bilum eins og gefið er upp hér að neðan.

func_name $arg_1 $arg_2 $arg_3

Inni í fallinu getum við nálgast rökin í röð sem $1, $2, $3 og svo framvegis. Horfðu á eftirfarandi dæmi skriftu til að finna hámarkið af tveimur heiltölum með því að nota fall til að auka skýrleika.

#!/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

Ofangreint lítur út fyrir að vera svolítið flókið, en það er einfalt ef við lesum í gegnum línurnar. Fyrst hreiður if-else if línur til að sannprófa, þ.e.a.s. til að athuga fjölda og tegund röka með hjálp reglulegra segða. Eftir það köllum við fallið með tveimur skipanalínurökum og birtum niðurstöðuna þar sjálfa. Þetta er vegna þess að við getum ekki skilað stórum heiltölum frá falli. Önnur leið til að vinna í kringum þetta vandamál er að nota alþjóðlegar breytur til að geyma niðurstöðuna inni í fallinu. Handritið hér að neðan útskýrir þessa aðferð.

#!/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

Prófaðu nú nokkur spennandi vandamál sem voru útskýrð í fyrri skeljaforskriftarröðinni með því að nota eftirfarandi aðgerðir.

  1. Skiljið undirstöðuráðleggingar um Linux Shell forskriftarmál – I. hluti
  2. 5 Shell forskriftir fyrir Linux nýliða til að læra Shell forritun – Part II
  3. Sigling í gegnum heim Linux BASH skrifta – hluti III
  4. Stærðfræðilegur þáttur Linux Shell-forritunar – Hluti IV
  5. Útreikningur á stærðfræðilegum tjáningum á skeljaforskriftarmáli – V. hluti

Ég mun koma aftur með meiri innsýn í hagnýta eiginleika eins og að nota staðbundnar breytur, endurkomu osfrv í næsta hluta. Vertu uppfærður með athugasemdum.