Bandau ieškoti, kaip perduoti parametrus "Bash" funkcijoje, bet visada randu, kaip perduoti parametrą iš komandinės eilutės.
Norėčiau perduoti parametrus savo scenarijuje. Bandžiau:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Bet sintaksė nėra teisinga, kaip perduoti parametrą mano funkcijai?
Yra du tipiniai funkcijos deklaravimo būdai. Man labiau patinka antrasis būdas.
function function_name {
command...
}
arba
function_name () {
command...
}
Funkcijos iškvietimas su argumentais:
function_name "$arg1" "$arg2"
Funkcija nurodo perduotus argumentus pagal jų poziciją (ne pagal pavadinimą), t. y. $1, $2 ir t. t. $0 yra paties scenarijaus pavadinimas.
Pavyzdys:
function_name () {
echo "Parameter #1 is $1"
}
Be to, funkciją reikia iškviesti po jos deklaravimo.
#!/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.
Išvestis:
./myScript.sh: line 2: foo: command not found
Parameter #1 is 2
Aukšto lygio programavimo kalbų (C/C++/Java/PHP/Python/Perl...) išmanymas nespecialistui leidžia manyti, kad bash funkcijos turėtų veikti taip pat, kaip ir tose kalbose. Antra, bash funkcijos veikia kaip apvalkalo komandos ir tikisi, kad joms bus perduoti argumentai taip pat, kaip apvalkalo komandai (ls -l) galima perduoti parinktį. Iš tikrųjų funkcijos argumentai bash sistemoje traktuojami kaip poziciniai parametrai ($1, $2...$9, ${10}, ${11}
ir t. t.). Tai nestebina, atsižvelgiant į tai, kaip veikia getopts
. Bash sistemoje nebūtina naudoti skliaustų, norint iškviesti funkciją.
(Pastaba: šiuo metu dirbu su "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