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?
- Pomáhá nám znovu použít kód.
- Zlepšení čitelnosti programu.
- Efektivní využití proměnných uvnitř programu.
- Umožňuje nám testovat program část po části.
- 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í.
- Pochopte základní tipy pro skriptovací jazyk Linux Shell – část I
- 5 skriptů Shell pro nováčky v Linuxu, aby se naučili programování Shell – část II
- Plavba světem Linuxu BASH Scripting – část III
- Matematický aspekt programování Linux Shell – část IV
- 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.