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?
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
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