Las funciones de shell Bash son una forma de agrupar varios comandos de UNIX/Linux para su posterior ejecución usando un solo nombre para el grupo . La función Bash Shell se puede ejecutar como un comando normal de Unix. Las funciones de shell se ejecutan en el contexto de shell actual sin crear ningún proceso nuevo para interpretarlas.
Tanto los alias como las funciones de bash le permiten definir accesos directos para comandos más largos o más complicados. Sin embargo, los alias no permiten flujos de control, argumentos y otros trucos que estas funciones permitirán, como se explica en este tutorial.
Este artículo es parte de la serie de tutoriales bash en curso. Consulte nuestro tutorial anterior sobre la introducción de bash, el estado de existencia de bash y los ejemplos de alias de bash.
Sintaxis para crear una función bash:
function functionname() { commands . . }
- función es una palabra clave que es opcional.
- nombre de función es el nombre de la función
- comandos – Lista de comandos a ejecutar en las funciones.
La función acepta argumentos. Durante la ejecución, los argumentos de la función se convierten en los parámetros posicionales. El parámetro posicional 0 tendrá el nombre del script que permanecerá sin cambios.
Puede llamar a la función bash desde la línea de comando como se muestra a continuación:
$ functionname arg1 arg2
- Cuando el shell interpreta un comando de Linux, primero busca las funciones integradas especiales como romper, continuar, evaluar, ejecutar, etc., luego busca las funciones del shell.
- El estado de salida de la función bash es el estado de salida del último comando ejecutado en el cuerpo de la función.
Ejemplo 1:Función para mostrar una larga lista de archivos con la extensión dada
La función "lsext" se usa para encontrar la lista de archivos en el directorio actual, que tiene la extensión dada como se muestra a continuación. Esta función utiliza la combinación del comando find y el comando ls para realizar el trabajo.
$ function lsext() { find . -type f -iname '*.'${1}'' -exec ls -l {} \; ; } $ cd ~ $ lsext txt -rw-r--r-- 1 root root 24 Dec 15 14:00 InMorning.txt -rw-r--r-- 1 root root 184 Dec 16 11:45 Changes16.txt -rw-r--r-- 1 root root 458 Dec 18 11:04 Changes18.txt -rw-r--r-- 1 root root 1821 Feb 4 15:01 ChangesOfDB.txt
Ejemplo 2. Función Bash para ejecutar un comando Linux dado en un grupo de archivos
En el siguiente ejemplo, la función "batchexec" encuentra los archivos con la extensión dada y ejecuta el comando dado en esos archivos seleccionados.
$ function batchexec() { find . -type f -iname '*.'${1}'' -exec ${@:2} {} \; ; } $ cd ~ $ batchexec sh ls $ batchexec sh chmod 755 $ ls -l *.sh -rwxr-xr-x 1 root root 144 Mar 9 14:39 debug.sh -rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh -rwxr-xr-x 1 root root 22 Mar 18 08:32 t.sh
En el ejemplo anterior, encuentra todos los archivos de script de shell con la extensión .sh y cambia su permiso a 755. (Todos los permisos para el usuario, para el grupo y otros permisos de lectura y ejecución). En la definición de la función, podría notar "${@:2}", que proporciona el segundo y los siguientes parámetros posicionales (característica de expansión de shell).
Ejemplo 3. Función Bash para generar contraseña aleatoria
La siguiente función se utiliza para generar contraseñas seguras aleatorias con un carácter especial para la longitud dada. Si la longitud no se proporciona de forma predeterminada, se genera con una longitud de 12 caracteres.
$ function rpass() { cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12} } $ rpass 6 -Ju.T[[ $ rpass Gz1f!aKN^""k
En el ejemplo anterior, cuando rpass se ejecuta con el argumento 6, genera una contraseña aleatoria con 6 caracteres y rpass sin argumento genera una contraseña de 12 caracteres de longitud. ${1:-12} significa que si $1 no está establecido o se devolverá un valor nulo 12, de lo contrario se sustituirá el valor de $1.
Ejemplo 4. Función Bash para obtener la dirección IP de una interfaz dada
El siguiente ejemplo define una función llamada 'getip' que acepta el nombre de la interfaz como argumento y proporciona la dirección IP asignada en la interfaz dada en la máquina. (por defecto devuelve la dirección IP eth0). Esto usa el comando ifconfig para obtener la dirección IP.
$ function getip() { /sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}'; } $ getip 15.110.106.86 $ getip eth0 15.110.106.86 $ getip lo 127.0.0.1
Ejemplo 5. Función Bash para imprimir los detalles de las máquinas
Este ejemplo define la función que proporciona toda la información necesaria sobre la máquina. Los usuarios pueden definir y llamar a esta función en los archivos de inicio, para que obtenga esta información durante el inicio.
$ function mach() { echo -e "\nMachine information:" ; uname -a echo -e "\nUsers logged on:" ; w -h echo -e "\nCurrent date :" ; date echo -e "\nMachine status :" ; uptime echo -e "\nMemory status :" ; free echo -e "\nFilesystem status :"; df -h } $ mach Machine information: Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux Users logged on: root pts/2 ptal.mot Wed10 0.00s 1.35s 0.01s w -h Current date : Thu Mar 18 11:59:36 CET 2010 Machine status : 11:59:36 up 7 days, 3 min, 1 user, load average: 0.01, 0.15, 0.15 Memory status : total used free shared buffers cached Mem: 2059768 2033212 26556 0 81912 797560 -/+ buffers/cache: 1153740 906028 Swap: 4192956 48164 4144792 Filesystem status : Filesystem Size Used Avail Use% Mounted on /dev/sda1 12G 12G 0 100% / tmpfs 1006M 377M 629M 38% /dev/shm /dev/sdc5 9.9G 409M 9.0G 5% /mydisk
Ejemplo 6:función Bash para formatear mejor la salida de ls
La siguiente función borrará la pantalla, colocará el cursor en la parte superior de la pantalla, ejecutará ls y luego colocará el cursor al final de la pantalla.
$ function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; } $ ll
Mostrar el código de función usando el comando de tipo
type es un shell integrado que se usa para ver el código de función.
Syntax: type function-name
$ type ll ll is a function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; alias ls="ls --color=auto -F" }
Para su fácil referencia, obtenga las 6 funciones mencionadas en este artículo de este archivo de funciones .bash_profile de muestra.
Agregue todas estas funciones a su archivo ~/.bash_profile, para asegurarse de tener acceso a estas funciones todo el tiempo sin tener que crearlas cada vez.