Vyhledávání na webu

Porozumění a psaní funkcí ve skriptech Shell - Část VI


Funkce hrají důležitou roli v každém programovacím jazyce. Stejně jako mnoho skutečných programovacích jazyků má bash funkce, které se používají s omezenou implementací.

Co jsou funkce?

V programování jsou funkce pojmenovány části programu, který provádí konkrétní úlohu. V tomto smyslu je funkce typem procedury nebo rutiny. Když je zavolána funkce, program opustí aktuální sekci kódu a začne provádět první řádek uvnitř funkce. Kdykoli se kód opakuje nebo když se úkol opakuje, zvažte použití funkce.

Vezměme si například případ, kdy potřebujeme najít faktoriál čísla v několika fázích konkrétního programu. Místo toho, abychom pokaždé psali celý kód (pro výpočet faktoriálu), můžeme napsat tu část kódu, která vypočítá faktoriál jednou uvnitř bloku a znovu ji použít při více příležitostech.

Proč píšeme funkce?

  1. Pomáhá nám znovu použít kód.
  2. Zlepšení čitelnosti programu.
  3. Efektivní využití proměnných uvnitř programu.
  4. Umožňuje nám testovat program část po části.
  5. Zobrazuje program jako skupinu dílčích kroků.
Funkce ve skriptech shellu

Obecná syntaxe pro zápis funkcí ve skriptu shellu zahrnuje následující způsoby.

function func_name {
	. . .
	commands
	. . .
}

or

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

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

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

Do těchto funkčních bloků můžete vždy psát platné příkazy, jak to běžně děláme ve skriptech shellu. Nyní zkusme napsat jeden jednoduchý skript s malou funkcí uvnitř.

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

Definice funkce musí předcházet jejímu prvnímu volání. Neexistuje nic jako ‚deklarování funkce‘ před jejím voláním. A vždy můžeme funkce vnořovat do funkcí.

Poznámka:- Psaní prázdných funkcí vždy vede k chybám syntaxe.

Když je stejná funkce definována vícekrát, je vyvolána konečná verze. Vezměme si příklad.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0
Funkce přebírající parametry a vracející hodnoty

Pojďme hlouběji zvažováním funkcí, které berou parametry a vracejí hodnoty. K vrácení hodnoty z funkce používáme vestavěný shell „návrat“. Syntaxe je následující.

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

Podobně můžeme předat argumenty funkcím odděleným mezerami, jak je uvedeno níže.

func_name $arg_1 $arg_2 $arg_3

Uvnitř funkce můžeme přistupovat k argumentům v pořadí jako $1, $2, $3 a tak dále. Podívejte se na následující ukázkový skript, abyste našli maximum dvou celých čísel pomocí funkce pro větší přehlednost.

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

Výše uvedené vypadá trochu složitě, ale je to jednoduché, pokud si přečteme řádky. Nejprve vnořené řádky if-else if pro účely ověření, tj. pro kontrolu počtu a typu argumentů pomocí regulárních výrazů. Poté zavoláme funkci se dvěma argumenty příkazového řádku a zobrazíme tam samotný výsledek. Je to proto, že z funkce nemůžeme vrátit velká celá čísla. Dalším způsobem, jak tento problém vyřešit, je použití globálních proměnných k uložení výsledku do funkce. Níže uvedený skript vysvětluje tuto metodu.

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

Nyní vyzkoušejte některé vzrušující problémy, které byly vysvětleny v předchozí sérii skriptování shellu pomocí následujících funkcí.

  1. Pochopte základní tipy pro skriptovací jazyk Linux Shell – část I
  2. 5 skriptů Shell pro nováčky v Linuxu, aby se naučili programování Shell – část II
  3. Plavba světem Linuxu BASH Scripting – část III
  4. Matematický aspekt programování Linux Shell – část IV
  5. Výpočet matematických výrazů ve skriptovacím jazyce Shell – část V

V další části se vrátím s větším přehledem o funkčních funkcích, jako je použití místních proměnných, rekurze atd. Zůstaňte informováni o komentářích.