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
  1. Wenn Sie das Argument in keiner Weise ändern, müssen Sie es nicht in eine local Variable kopieren - geben Sie einfach echo "Hello, $1" .

  2. 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.

  3. $@ 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 *
    
  4. 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
    
  5. 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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow