Passare parametri a una funzione Bash

Sto provando a cercare come passare parametri in una funzione Bash, ma quello che viene fuori è sempre come passare parametri dalla linea di comando.

Vorrei passare dei parametri all'interno del mio script. Ho provato:

myBackupFunction("..", "...", "xx")

function myBackupFunction($directory, $options, $rootPassword) {
     ...
}

Ma la sintassi non è corretta, come passare un parametro alla mia funzione?

Soluzione

Ci sono due modi tipici di dichiarare una funzione. Io preferisco il secondo approccio.

function function_name {
   command...
} 

o

function_name () {
   command...
} 

Per chiamare una funzione con argomenti:

function_name "$arg1" "$arg2"

La funzione si riferisce agli argomenti passati per la loro posizione (non per nome), cioè $1, $2, e così via. $0 è il nome dello script stesso.

Esempio:

function_name () {
   echo "Parameter #1 is $1"
}

Inoltre, dovete chiamare la vostra funzione dopo che è stata dichiarata.

#!/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

Riferimento: Advanced Bash-Scripting Guide.

Commentari (9)

La conoscenza dei linguaggi di programmazione di alto livello (C/C++/Java/PHP/Python/Perl ...) suggerirebbe al profano che le funzioni bash dovrebbero lavorare come fanno in questi altri linguaggi. Invece, le funzioni bash lavorano come comandi di shell e si aspettano che gli argomenti vengano passati a loro nello stesso modo in cui si potrebbe passare un'opzione a un comando di shell (ls -l). In effetti, gli argomenti delle funzioni in bash sono trattati come parametri posizionali ($1, $2..$9, ${10}, ${11}, e così via). Questo non è una sorpresa considerando come funziona getopts. Le parentesi non sono necessarie per chiamare una funzione in bash.


(Nota: mi capita di lavorare su Open Solaris al momento).

# 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
Commentari (0)

Mancano le parentesi e le virgole:

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

e la funzione dovrebbe apparire così:

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