Übergabe von Parametern an eine Bash-Funktion

Ich versuche zu suchen, wie man Parameter in einer Bash-Funktion übergeben, aber was kommt, ist immer, wie man Parameter von der Befehlszeile übergeben.

Ich würde gerne Parameter innerhalb meines Skripts übergeben. Ich habe es versucht:

myBackupFunction("..", "...", "xx")

function myBackupFunction($directory, $options, $rootPassword) {
     ...
}

Aber die Syntax ist nicht korrekt, wie kann ich einen Parameter an meine Funktion übergeben?

Lösung

Es gibt zwei typische Möglichkeiten, eine Funktion zu deklarieren. Ich bevorzuge den zweiten Ansatz.

function function_name {
   command...
} 

oder

function_name () {
   command...
} 

Um eine Funktion mit Argumenten aufzurufen:

function_name "$arg1" "$arg2"

Die Funktion bezieht sich auf die übergebenen Argumente durch ihre Position (nicht durch ihren Namen), d.h. $1, $2 und so weiter. $0 ist der Name des Skripts selbst.

Beispiel:

function_name () {
   echo "Parameter #1 is $1"
}

Außerdem müssen Sie Ihre Funktion nach ihrer Deklaration aufrufen.

#!/usr/bin/env sh

foo 1  # this will fail because foo has not been declared yet.

foo() {
    echo "Parameter #1 is $1"
}

foo 2 # this will work.

Ausgabe:

./myScript.sh: line 2: foo: command not found
Parameter #1 is 2

Referenz: Advanced Bash-Scripting Guide.

Kommentare (9)

Die Kenntnis von höheren Programmiersprachen (C/C++/Java/PHP/Python/Perl ...) würde dem Laien suggerieren, dass Bash-Funktionen so funktionieren sollten wie in diesen anderen Sprachen. Stattdessen funktionieren Bash-Funktionen wie Shell-Befehle und erwarten, dass ihnen Argumente auf die gleiche Weise übergeben werden, wie man einem Shell-Befehl eine Option übergeben kann (ls -l). In der Tat werden Funktionsargumente in der Bash als Positionsparameter* behandelt ($1, $2..$9, ${10}, ${11}, und so weiter). Das ist keine Überraschung, wenn man bedenkt, wie getopts funktioniert. Klammern sind nicht erforderlich, um eine Funktion in der Bash aufzurufen.


(Anmerkung: Ich arbeite zufällig gerade an Open Solaris.)

# bash style declaration for all you PHP/JavaScript junkies. :-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
function backupWebRoot ()
{
    tar -cvf - $1 | zip -n .jpg:.gif:.png $2 - 2>> $errorlog &&
        echo -e "\nTarball created!\n"
}

# sh style declaration for the purist in you. ;-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
backupWebRoot ()
{
    tar -cvf - $1 | zip -n .jpg:.gif:.png $2 - 2>> $errorlog &&
        echo -e "\nTarball created!\n"
}

#In the actual shell script
#$0               $1            $2

backupWebRoot ~/public/www/ webSite.tar.zip
Kommentare (0)

Lassen Sie die Parens und Kommas weg:

 myBackupFunction ".." "..." "xx"

und die Funktion sollte wie folgt aussehen:

function myBackupFunction() {
   # here $1 is the first parameter, $2 the second etc.
}
Kommentare (0)