Ik probeer te zoeken hoe ik parameters door kan geven in een Bash functie, maar wat er naar voren komt is altijd hoe ik een parameter door kan geven vanaf de opdrachtregel.
Ik wil parameters doorgeven binnen mijn script. Ik heb het geprobeerd:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Maar de syntaxis is niet correct, hoe geef ik een parameter door aan mijn functie?
Er zijn twee typische manieren om een functie te declareren. Ik verkies de tweede aanpak.
function function_name {
command...
}
of
function_name () {
command...
}
Om een functie met argumenten op te roepen:
function_name "$arg1" "$arg2"
De functie verwijst naar doorgegeven argumenten door hun positie (niet door hun naam), dat is $1, $2, enzovoort. $0 is de naam van het script zelf.
Voorbeeld:
function_name () {
echo "Parameter #1 is $1"
}
Ook moet je je functie aanroepen nadat hij gedeclareerd is.
#!/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.
Uitvoer:
./myScript.sh: line 2: foo: command not found
Parameter #1 is 2
Kennis van programmeertalen op hoog niveau (C/C++/Java/PHP/Python/Perl ...) zou voor de leek suggereren dat bash functies zouden moeten werken zoals ze in die andere talen werken. In plaats daarvan werken bash functies als shell commando's en verwachten ze dat er argumenten aan worden doorgegeven op dezelfde manier als men een optie doorgeeft aan een shell commando (ls -l). In feite worden functie argumenten in bash behandeld als positionele parameters ($1, $2..$9, ${10}, ${11}
, enzovoort). Dit is geen verrassing als je bedenkt hoe getopts
werkt. Parentheses zijn niet nodig om een functie in bash aan te roepen.
(Note: Ik werk toevallig op Open Solaris op dit moment).
# 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