Yritän etsiä, miten välittää parametreja Bash-funktiossa, mutta tuloksena on aina, miten välittää parametri komentoriviltä.
Haluaisin siirtää parametreja skriptini sisällä. Olen kokeillut:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Mutta syntaksi ei ole oikea, miten välitän parametrin funktiooni?
On kaksi tyypillistä tapaa ilmoittaa funktio. Suosin toista lähestymistapaa.
function function_name {
command...
}
tai
function_name () {
command...
}
Voit kutsua funktiota, jolla on argumentteja:
function_name "$arg1" "$arg2"
Funktio viittaa välitettyihin argumentteihin niiden sijainnin mukaan (ei nimen mukaan), eli $1, $2 ja niin edelleen. $0 on itse skriptin nimi.
Esimerkki:
function_name () {
echo "Parameter #1 is $1"
}
Lisäksi sinun on kutsuttava funktiota sen jälkeen, kun se on julistettu.
#!/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.
Tulos:
./myScript.sh: line 2: foo: command not found
Parameter #1 is 2
Korkean tason ohjelmointikielten (C/C++/Java/PHP/Python/Perl ...) tuntemus antaisi maallikolle ymmärtää, että bash-funktioiden pitäisi toimia kuten näissä muissa kielissä. Sen sijaan bash-funktiot toimivat kuin komentotulkin komennot ja odottavat, että niille annetaan argumentteja samalla tavalla kuin komentotulkin komennolle (ls -l). Itse asiassa funktioiden argumentteja käsitellään bashissa asetusparametreina* ($1, $2..$9, ${10}, ${11}
, ja niin edelleen). Tämä ei ole yllätys, kun otetaan huomioon, miten getopts
toimii. Sulkumerkkejä ei tarvita kutsuttaessa funktiota bashissa.
(Huomautus: Satun työskentelemään Open Solariksella tällä hetkellä.)
# 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