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?
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
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