Skicka parametrar till en Bash-funktion

Jag försöker söka efter hur man skickar parametrar i en Bash-funktion, men det som dyker upp är alltid hur man skickar parametrar från kommandoraden.

Jag skulle vilja skicka parametrar i mitt skript. Jag har försökt:

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

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

Men syntaxen är inte korrekt, hur kan jag skicka en parameter till min funktion?

Lösning

Det finns två typiska sätt att deklarera en funktion. Jag föredrar det andra sättet.

function function_name {
   command...
} 

eller

function_name () {
   command...
} 

Anropa en funktion med argument:

function_name "$arg1" "$arg2"

Funktionen hänvisar till de överlämnade argumenten genom deras position (inte genom namnet), det vill säga $1, $2 och så vidare. $0 är namnet på själva skriptet.

Exempel:

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

Du måste också kalla din funktion efter att den har deklarerats.

#!/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.

Output:

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

Referens: Advanced Bash-Scripting Guide.

Kommentarer (9)

Kunskap om programmeringsspråk på hög nivå (C/C++/Java/PHP/Python/Perl ...) skulle för en lekman innebära att bash-funktioner borde fungera på samma sätt som i dessa andra språk. Istället fungerar bash-funktioner som skalkommandon och förväntar sig att argument skickas till dem på samma sätt som man kan skicka ett alternativ till ett skalkommando (ls -l). I själva verket behandlas funktionsargument i bash som positionsparametrar* ($1, $2..$9, ${10}, ${11}, och så vidare). Detta är ingen överraskning med tanke på hur getopts fungerar. Parenteser krävs inte för att anropa en funktion i bash.


(Note: Jag råkar arbeta med Open Solaris för tillfället.)

# 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
Kommentarer (0)

Lämna bort parens och kommatecken:

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

och funktionen bör se ut så här:

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