Parametrien välittäminen Bash-funktioon

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?

Ratkaisu

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

Viite: Advanced Bash-Scripting Guide.

Kommentit (9)

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
Kommentit (0)

Jätä sulut ja pilkut pois:

 myBackupFunction ".." "..." "xx"

ja funktion pitäisi näyttää tältä:

function myBackupFunction() {
   # here $1 is the first parameter, $2 the second etc.
}
Kommentit (0)