Jeg prøver å søke hvordan jeg sender parametere i en Bash-funksjon, men det som kommer opp er alltid hvordan jeg sender parameter fra kommandolinjen.
Jeg vil gjerne sende parametere i skriptet mitt. Jeg har prøvd:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Men syntaksen er ikke riktig, hvordan sender jeg en parameter til funksjonen min?
Det er to typiske måter å erklære en funksjon på. Jeg foretrekker den andre tilnærmingen.
function function_name {
command...
}
eller
function_name () {
command...
}
For å kalle en funksjon med argumenter:
function_name "$arg1" "$arg2"
Funksjonen refererer til overførte argumenter ved deres posisjon (ikke ved navn), det vil si $1, $2 og så videre. $0 er navnet på selve skriptet.
Eksempel:
function_name () {
echo "Parameter #1 is $1"
}
Du må også kalle funksjonen din etter at den er deklarert.
#!/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
Kunnskap om programmeringsspråk på høyt nivå (C/C++/Java/PHP/Python/Perl ...) ville antyde for lekmannen at bash-funksjoner burde fungere som de gjør i disse andre språkene. I stedet fungerer bash-funksjoner som shell-kommandoer og forventer at argumenter sendes til dem på samme måte som man kan sende et alternativ til en shell-kommando (ls -l). Faktisk blir funksjonsargumenter i bash behandlet som posisjonelle parametere ($1, $2..$9, ${10}, ${11}
, og så videre). Dette er ingen overraskelse med tanke på hvordan getopts
fungerer. Parenteser er ikke nødvendig for å kalle en funksjon i bash.
(Note: Jeg jobber tilfeldigvis med Open Solaris for øyeblikket).
# 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