Unix / Linux - Funciones de Shell
En este capítulo, discutiremos en detalle sobre las funciones de shell. Las funciones le permiten dividir la funcionalidad general de un script en subsecciones lógicas más pequeñas, a las que luego se les puede llamar para realizar sus tareas individuales cuando sea necesario.
El uso de funciones para realizar tareas repetitivas es una excelente manera de crear code reuse. Esta es una parte importante de los principios modernos de programación orientada a objetos.
Las funciones de shell son similares a las subrutinas, procedimientos y funciones de otros lenguajes de programación.
Creando funciones
Para declarar una función, simplemente use la siguiente sintaxis:
function_name () {
list of commands
}
El nombre de su función es function_name, y eso es lo que usará para llamarlo desde otra parte de sus scripts. El nombre de la función debe ir seguido de paréntesis, seguido de una lista de comandos entre llaves.
Ejemplo
El siguiente ejemplo muestra el uso de la función -
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello
Tras la ejecución, recibirá el siguiente resultado:
$./test.sh
Hello World
Pasar parámetros a una función
Puede definir una función que acepte parámetros mientras llama a la función. Estos parámetros estarían representados por$1, $2 y así.
A continuación se muestra un ejemplo en el que pasamos dos parámetros Zara y Ali y luego capturamos e imprimimos estos parámetros en la función.
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
}
# Invoke your function
Hello Zara Ali
Tras la ejecución, recibirá el siguiente resultado:
$./test.sh
Hello World Zara Ali
Devolver valores de funciones
Si ejecuta un exit comando desde dentro de una función, su efecto no es solo terminar la ejecución de la función sino también del programa de shell que llamó a la función.
Si, en cambio, solo desea terminar la ejecución de la función, entonces hay una forma de salir de una función definida.
Según la situación, puede devolver cualquier valor de su función utilizando el return comando cuya sintaxis es la siguiente:
return code
aquí code puede ser cualquier cosa que elija aquí, pero obviamente debe elegir algo que sea significativo o útil en el contexto de su script en su conjunto.
Ejemplo
La siguiente función devuelve un valor 10 -
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
return 10
}
# Invoke your function
Hello Zara Ali
# Capture value returnd by last command
ret=$?
echo "Return value is $ret"
Tras la ejecución, recibirá el siguiente resultado:
$./test.sh
Hello World Zara Ali
Return value is 10
Funciones anidadas
Una de las características más interesantes de las funciones es que pueden llamarse a sí mismas y también a otras funciones. Una función que se llama a sí misma se conoce comorecursive function.
El siguiente ejemplo demuestra el anidamiento de dos funciones:
#!/bin/sh
# Calling one function from another
number_one () {
echo "This is the first function speaking..."
number_two
}
number_two () {
echo "This is now the second function speaking..."
}
# Calling function one.
number_one
Tras la ejecución, recibirá el siguiente resultado:
This is the first function speaking...
This is now the second function speaking...
Llamada a función desde el indicador
Puede poner definiciones para funciones de uso común dentro de su .profile. Estas definiciones estarán disponibles siempre que inicie sesión y puede usarlas en el símbolo del sistema.
Alternativamente, puede agrupar las definiciones en un archivo, digamos test.shy luego ejecute el archivo en el shell actual escribiendo -
$. test.sh
Esto tiene el efecto de causar funciones definidas dentro test.sh para leerse y definirse en el shell actual de la siguiente manera:
$ number_one
This is the first function speaking...
This is now the second function speaking...
$
Para eliminar la definición de una función del shell, use el comando unset con el .fopción. Este comando también se usa para eliminar la definición de una variable en el shell.
$ unset -f function_name