Bash
Funktionen
Suche…
Syntax
Definieren Sie eine Funktion mit dem
function
:function f {
}
Definiere eine Funktion mit
()
:f(){
}
Definieren Sie eine Funktion mit dem
function
und()
:function f(){
}
Einfache Funktion
In helloWorld.sh
#!/bin/bash
# Define a function greet
greet ()
{
echo "Hello World!"
}
# Call the function greet
greet
Beim Ausführen des Skripts sehen wir unsere Nachricht
$ bash helloWorld.sh
Hello World!
Beachten Sie, dass das Sourcing einer Datei mit Funktionen diese in Ihrer aktuellen Bash-Sitzung verfügbar macht.
$ source helloWorld.sh # or, more portably, ". helloWorld.sh"
$ greet
Hello World!
Sie können eine Funktion in einigen Shells export
, sodass sie untergeordneten Prozessen ausgesetzt ist.
bash -c 'greet' # fails
export -f greet # export function; note -f
bash -c 'greet' # success
Funktionen mit Argumenten
In helloJohn.sh
:
#!/bin/bash
greet() {
local name="$1"
echo "Hello, $name"
}
greet "John Doe"
# running above script
$ bash helloJohn.sh
Hello, John Doe
Wenn Sie das Argument in keiner Weise ändern, müssen Sie es nicht in eine
local
Variable kopieren - geben Sie einfachecho "Hello, $1"
.Sie können
$1
,$2
,$3
usw. verwenden, um auf die Argumente in der Funktion zuzugreifen.Hinweis: Bei Argumenten mit mehr als 9
$10
wird dies nicht funktionieren (Bash wird als $ 1 0 gelesen), müssen Sie${10}
,${11}
usw. ausführen.$@
bezieht sich auf alle Argumente einer Funktion:#!/bin/bash foo() { echo "$@" } foo 1 2 3 # output => 1 2 3
Hinweis: Sie sollten praktisch immer doppelte Anführungszeichen um
"$@"
, wie hier.Wenn Sie die Anführungszeichen nicht angeben, erweitert die Shell die Platzhalterzeichen (auch wenn der Benutzer sie ausdrücklich angegeben hat, um dies zu vermeiden) und führt im Allgemeinen zu unerwünschtem Verhalten und möglicherweise sogar zu Sicherheitsproblemen.
foo "string with spaces;" '$HOME' "*" # output => string with spaces; $HOME *
Verwenden Sie für Standardargumente
${1:-default_val}
. Z.B:#!/bin/bash foo() { local val=${1:-25} echo "$val" } foo # output => 25 foo 30 # output => 30
Um ein Argument anzufordern, verwende
${var:?error message}
foo() { local val=${1:?Must provide an argument} echo "$val" }
Rückgabewert von einer Funktion
Die return
Anweisung in Bash gibt keinen Wert wie C-Funktionen zurück, sondern beendet die Funktion mit einem Return-Status. Sie können sich den Exit-Status dieser Funktion vorstellen.
Wenn Sie einen Wert aus der Funktion zurückgeben möchten, senden Sie den Wert wie stdout
an stdout
:
fun() {
local var="Sample value to be returned"
echo "$var"
#printf "%s\n" "$var"
}
Nun, wenn Sie das tun:
var="$(fun)"
Die Ausgabe von fun
wird in $var
gespeichert.
Umgang mit Flags und optionalen Parametern
Das eingebaute getopts kann in Funktionen verwendet werden, um Funktionen zu schreiben, die Flags und optionale Parameter enthalten. Dies stellt keine besondere Schwierigkeit dar, aber man muss die von getopts berührten Werte entsprechend behandeln . Als Beispiel definieren wir eine Failwith- Funktion, die eine Nachricht in stderr schreibt und mit Code 1 oder einem beliebigen Code, der als Parameter für die Option -x
bereitgestellt wird, beendet:
# failwith [-x STATUS] PRINTF-LIKE-ARGV
# Fail with the given diagnostic message
#
# The -x flag can be used to convey a custom exit status, instead of
# the value 1. A newline is automatically added to the output.
failwith()
{
local OPTIND OPTION OPTARG status
status=1
OPTIND=1
while getopts 'x:' OPTION; do
case ${OPTION} in
x) status="${OPTARG}";;
*) 1>&2 printf 'failwith: %s: Unsupported option.\n' "${OPTION}";;
esac
done
shift $(( OPTIND - 1 ))
{
printf 'Failure: '
printf "$@"
printf '\n'
} 1>&2
exit "${status}"
}
Diese Funktion kann wie folgt verwendet werden:
failwith '%s: File not found.' "${filename}"
failwith -x 70 'General internal error.'
und so weiter.
Beachten Sie, dass wie bei printf Variablen nicht als erstes Argument verwendet werden sollten. Wenn die auszudruckende Nachricht aus dem Inhalt einer Variablen besteht, sollten Sie den Ausdruck %s
, um sie wie in zu drucken
failwith '%s' "${message}"
Der Exit-Code einer Funktion ist der Exit-Code des letzten Befehls
Betrachten Sie diese Beispielfunktion, um zu überprüfen, ob ein Host in Betrieb ist:
is_alive() {
ping -c1 "$1" &> /dev/null
}
Diese Funktion sendet einen einzelnen Ping an den durch den ersten Funktionsparameter angegebenen Host. Die Ausgabe und die Fehlerausgabe von ping
werden beide nach /dev/null
umgeleitet, sodass die Funktion niemals etwas ausgibt. Der ping
Befehl hat jedoch bei Erfolg den Exit-Code 0 und bei einem Fehler nicht Null. Da dies der letzte (und in diesem Beispiel der einzige) Befehl der Funktion ist, wird der Exit-Code von ping
für den Exit-Code der Funktion selbst wiederverwendet.
Diese Tatsache ist in Bedingungsanweisungen sehr nützlich.
Wenn zum Beispiel Host graucho
ist, dann verbinden Sie sich mit ssh
:
if is_alive graucho; then
ssh graucho
fi
Ein anderes Beispiel: Überprüfen Sie wiederholt, bis der Host graucho
ist, und stellen Sie dann eine Verbindung mit ssh
:
while ! is_alive graucho; do
sleep 5
done
ssh graucho
Drucken Sie die Funktionsdefinition
getfunc() {
declare -f "$@"
}
function func(){
echo "I am a sample function"
}
funcd="$(getfunc func)"
getfunc func # or echo "$funcd"
Ausgabe:
func ()
{
echo "I am a sample function"
}
Eine Funktion, die benannte Parameter akzeptiert
foo() {
while [[ "$#" -gt 0 ]]
do
case $1 in
-f|--follow)
local FOLLOW="following"
;;
-t|--tail)
local TAIL="tail=$2"
;;
esac
shift
done
echo "FOLLOW: $FOLLOW"
echo "TAIL: $TAIL"
}
Verwendungsbeispiel:
foo -f
foo -t 10
foo -f --tail 10
foo --follow --tail 10