Unix / Linux - funkcje powłoki

W tym rozdziale omówimy szczegółowo funkcje powłoki. Funkcje umożliwiają rozbicie ogólnej funkcjonalności skryptu na mniejsze, logiczne podsekcje, które mogą być następnie wywoływane w celu wykonania ich indywidualnych zadań w razie potrzeby.

Używanie funkcji do wykonywania powtarzalnych zadań to doskonały sposób na tworzenie code reuse. Jest to ważna część współczesnych zasad programowania obiektowego.

Funkcje powłoki są podobne do podprogramów, procedur i funkcji w innych językach programowania.

Tworzenie funkcji

Aby zadeklarować funkcję, po prostu użyj następującej składni -

function_name () { 
   list of commands
}

Nazwa Twojej funkcji to function_name, i właśnie tego użyjesz, aby wywołać go z innego miejsca w swoich skryptach. Po nazwie funkcji należy umieścić nawiasy, po których następuje lista poleceń ujęta w nawiasy.

Przykład

Poniższy przykład pokazuje użycie funkcji -

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World"
}

# Invoke your function
Hello

Po wykonaniu otrzymasz następujące dane wyjściowe -

$./test.sh
Hello World

Przekaż parametry do funkcji

Możesz zdefiniować funkcję, która będzie akceptować parametry podczas wywoływania funkcji. Te parametry byłyby reprezentowane przez$1, $2 i tak dalej.

Poniżej znajduje się przykład, w którym przekazujemy dwa parametry Zara i Ali, a następnie przechwytujemy i drukujemy te parametry w funkcji.

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
}

# Invoke your function
Hello Zara Ali

Po wykonaniu otrzymasz następujący wynik -

$./test.sh
Hello World Zara Ali

Zwracanie wartości z funkcji

Jeśli wykonasz plik exit polecenia z wnętrza funkcji, jego skutkiem jest nie tylko zakończenie wykonywania funkcji, ale także programu powłoki, który ją wywołał.

Jeśli zamiast tego chcesz po prostu zakończyć wykonywanie funkcji, istnieje sposób na wyjście ze zdefiniowanej funkcji.

W zależności od sytuacji możesz zwrócić dowolną wartość z funkcji za pomocą return polecenie, którego składnia jest następująca -

return code

Tutaj code może być wszystkim, co wybierzesz, ale oczywiście powinieneś wybrać coś, co jest znaczące lub przydatne w kontekście twojego skryptu jako całości.

Przykład

Następująca funkcja zwraca wartość 10 -

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}

# Invoke your function
Hello Zara Ali

# Capture value returnd by last command
ret=$?

echo "Return value is $ret"

Po wykonaniu otrzymasz następujący wynik -

$./test.sh
Hello World Zara Ali
Return value is 10

Funkcje zagnieżdżone

Jedną z bardziej interesujących cech funkcji jest to, że mogą nazywać siebie i inne funkcje. Funkcja, która wywołuje samą siebie, jest znana jakorecursive function.

Poniższy przykład demonstruje zagnieżdżanie dwóch funkcji -

#!/bin/sh

# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}

number_two () {
   echo "This is now the second function speaking..."
}

# Calling function one.
number_one

Po wykonaniu otrzymasz następujący wynik -

This is the first function speaking...
This is now the second function speaking...

Wywołanie funkcji z Prompt

Możesz umieścić definicje często używanych funkcji w swoim .profile. Te definicje będą dostępne za każdym razem, gdy się zalogujesz, i możesz ich używać w wierszu polecenia.

Możesz też zgrupować definicje w pliku, powiedzmy test.sh, a następnie uruchom plik w bieżącej powłoce, wpisując -

$. test.sh

Powoduje to wywołanie funkcji zdefiniowanych wewnątrz test.sh do odczytania i zdefiniowania w bieżącej powłoce w następujący sposób -

$ number_one
This is the first function speaking...
This is now the second function speaking...
$

Aby usunąć definicję funkcji z powłoki, użyj polecenia unset z rozszerzeniem .fopcja. To polecenie służy również do usuwania definicji zmiennej z powłoki.

$ unset -f function_name