Estoy tratando de buscar cómo pasar parámetros en una función Bash, pero lo que aparece siempre es cómo pasar parámetros desde la línea de comandos.
Me gustaría pasar parámetros dentro de mi script. Lo intenté:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Pero la sintaxis no es correcta, ¿cómo pasar un parámetro a mi función?
bash
parameters
arguments
stivlo
fuente
fuente
Respuestas:
Hay dos formas típicas de declarar una función. Prefiero el segundo enfoque.
o
Para llamar a una función con argumentos:
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 script en sí.
Ejemplo:
Además, debe llamar a su función después de que se declare.
Salida:
Referencia: Guía avanzada de secuencias de comandos Bash .
fuente
function name() {}
. Tal vez con un 'entrar' antes{}
function
palabra clave y el()
. Mi objetivo (en un archivo, no la línea de comandos) es aumentar la claridad, no reduce el número de caracteres escritos, es decir,function myBackupFunction() compound-statement
.function
versión de la palabra clave es una extensión; la otra forma funciona en todos los shells compatibles con POSIX.function
palabra clave tenía garantías en los antiguos shells de la familia ksh que introdujeron que bash moderno no honra (en tales shells, lasfunction
variables se convirtieron en locales de forma predeterminada; en bash , no es asi). Como tal, su uso disminuye la claridad para cualquiera que conozca y pueda esperar el comportamiento ksh. Ver wiki.bash-hackers.org/scripting/obsoleteEl conocimiento de lenguajes de programación de alto nivel (C / C ++ / Java / PHP / Python / Perl ...) sugeriría al lego que las funciones bash deberían funcionar como lo hacen en esos otros lenguajes. En cambio , las funciones bash funcionan como comandos de shell y esperan que se les pasen argumentos de la misma manera que uno podría pasar una opción a un comando de shell (por ejemplo
ls -l
). En efecto, los argumentos de función en bash se tratan como parámetros posicionales ($1, $2..$9, ${10}, ${11}
y así sucesivamente). Esto no es sorprendente teniendo en cuenta cómogetopts
funciona. No use paréntesis para llamar a una función en bash.( Nota : actualmente estoy trabajando en Open Solaris).
Quiere usar nombres para variables. Solo haz esto.
¿Quieres pasar una matriz a una función?
Dentro de la función, maneje los argumentos como este.
¿Necesita pasar un valor y una matriz, pero aún usa "$ @" dentro de la función?
fuente
Si prefiere los parámetros con nombre, es posible (con algunos trucos) pasar los parámetros con nombre a las funciones (también hace posible pasar matrices y referencias).
El método que desarrollé le permite definir parámetros con nombre pasados a una función como esta:
También puede anotar argumentos como @required o @readonly, crear ... descansar argumentos, crear matrices a partir de argumentos secuenciales (usando, por ejemplo
string[4]
) y opcionalmente enumerar los argumentos en varias líneas:En otras palabras, no solo puede llamar a sus parámetros por sus nombres (lo que compensa un núcleo más legible), sino que también puede pasar matrices (y referencias a variables; ¡esta función solo funciona en bash 4.3)! Además, las variables asignadas están todas en el ámbito local, igual que $ 1 (y otras).
El código que hace que esto funcione es bastante ligero y funciona tanto en bash 3 como en bash 4 (estas son las únicas versiones con las que lo he probado). Si está interesado en más trucos como este que hacen que el desarrollo con bash sea mucho más fácil y fácil, puede echar un vistazo a mi Bash Infinity Framework , el siguiente código está disponible como una de sus funcionalidades.
fuente
@var
,@reference
,@params
las variables? ¿Qué debo buscar en Internet para obtener más información al respecto?ucommon
y mi código. Es posible que tenga alguna herramienta instalada que cause el problema que mencionó, sin saber qué podría ser.Se pierden los parens y las comas:
y la función debería verse así:
fuente
Espero que este ejemplo te pueda ayudar. Toma dos números del usuario, los alimenta a la función llamada
add
(en la última línea del código) yadd
los sumará e imprimirá.fuente
Un ejemplo simple que se borrará tanto durante la ejecución del script como dentro del script mientras se llama a una función.
fuente
Pensé en hablar con otra forma de pasar parámetros con nombre a bash ... pasando por referencia. Esto es compatible a partir de bash 4.0
Una sintaxis alternativa para bash 4.3 es usar un nameref
Aunque el nameref es mucho más conveniente ya que elimina las referencias sin problemas, algunas distribuciones compatibles más antiguas aún envían una versión anterior, por lo que aún no la recomendaré.
fuente