Estoy tratando de buscar cómo pasar parámetros en una función Bash, pero lo que sale es siempre cómo pasar parámetros desde la línea de comandos.
Me gustaría pasar parámetros dentro de mi script. Lo he intentado:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Pero la sintaxis no es correcta, ¿cómo pasar un parámetro a mi función?
Hay dos formas típicas de declarar una función. Yo prefiero el segundo enfoque.
function function_name {
command...
}
o
function_name () {
command...
}
Para llamar a una función con argumentos:
function_name "$arg1" "$arg2"
La función se refiere a los argumentos pasados por su posición (no por su nombre), es decir, $1, $2, etc. $0 es el nombre del propio script.
Ejemplo:
function_name () {
echo "Parameter #1 is $1"
}
Además, debe llamar a su función después de declararla.
#!/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.
Salida:
./myScript.sh: line 2: foo: command not found
Parameter #1 is 2
El conocimiento de los lenguajes de programación de alto nivel (C/C++/Java/PHP/Python/Perl ...) sugeriría al profano que las funciones de bash deberían funcionar como lo hacen en esos otros lenguajes. En su lugar, las funciones de bash funcionan como comandos de la shell y esperan que se les pasen argumentos de la misma manera que uno puede pasar una opción a un comando de la shell (ls -l). En efecto, los argumentos de las funciones en bash se tratan como parámetros de posición* ($1, $2..$9, ${10}, ${11}
, etc.). Esto no es una sorpresa teniendo en cuenta cómo funciona getopts
. Los paréntesis no son necesarios para llamar a una función en bash.
(Nota: Resulta que estoy trabajando en Open Solaris en este 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