Para afianzar nuestros conceptos aprenderemos 2 herramientas muy útiles para programar y que se desenvuelven perfectamente en Bash. Aprender a crear funciones y definir tuberías puede parecer complejo al principio, pero luego veremos la inmensa utilidad que nos proveen. |
Tuberías (pipes)
Concretamente y sin dar muchas vueltas, una tubería es un método que permite dirigir la salida de un proceso como la entrada de otro, lo cual permite una serie de ventajas, como reducir las líneas de código, prescindir de variables de almacenamiento de resultados y mejorar la eficiencia del script.
Una tubería se reconoce generalmente por poseer el símbolo | que permite concatenar expresiones; si bien es usada por defecto, existen otras formas de crear tuberías.
Ejemplo: imprimir mensajes recientes del kernel
#dmesg permite ver los mensajes recientes del kernel y drivers cargados #durante el booteo del sistema; tail imprime las últimas partes de un archivo o #comando
dmesg | tail
Si bien se pueden complicar tanto como queramos, la estructura básica de una tubería permite que el resultado de un comando sea usado como entrada del siguiente, el cual puede proveer la entrada de un nuevo comando si seguimos agregando tuberías consecutivas.
Funciones
Las funciones son un conjunto de sentencias que se agrupan para poder ser ejecutadas varias veces sin tener q volver a escribirlas. Es equivalente a pensar que cuando aprendemos a cocinar un tipo de comida escribiremos su receta en una hoja, y cada vez que deseamos cocinar esa comida consultamos la receta en lugar de volver a escribir una nueva hoja con la misma receta.
Quizás lo más importante de las funciones es la posibilidad de pasarle parámetros, datos que estas usarán para procesarlos y generar una salida. Su estructura es la siguiente:
function nombre-de-la-función {
procesos
}
Ejemplo: función que muestra los servicios que funcionan sobre el protocolo tcp. También podemos ver cómo aplicar más tuberías.
#Definimos un nombre de función, puede ser el que nos guste.
function servicios_tcp {
#cat concatena y muestra el contenido de la carpeta /etc/services, que es la #que contiene todos los servicios con sus puertos asociados.
#el primer grep toma la lista y elimina los comentarios, con –v invertimos el resultado
#el segundo grep muestra solo los relacionados a tcp
cat /etc/services | grep –v “^#” | grep tcp
}
Cuando necesitemos ejectuar esta función solo tenemos que llarmarla por su nombre:
servicios_tcp
En este caso funciona sin parámetros; en el caso de que los tenga debemos agregarlos para que la función trabaje adecuadamente, caso contrario la función no funcionará adecuadamente. El uso de return permite a una función devolver un valor como resultado del proceso.
Ejemplo: función con parámetros de entrada que calcula la suma de 2 números.
#!/bin/bash
function suma()
{
#con let podemos ejecutar la operación dentro de las comillas
let "resultado=$1 + $2"
#return permite devolver el valor entero. Una vez ejecutado el return, el valor quedará depositado dentro de la variable $?
return $resultado;
}
#se llama a la función suma y pasamos 2 parámetros de entrada.
suma 2 3
#se imprime el valor de $? con echo evaluando el valor real de la variable entre comillas
echo -e "Resultado = $?";
no estoy seguro, pero la sentencia return de las funciones sirve solo para devolver un entero entre 0 y 255, como los códigos de error de «exit», generalmente 0 si está todo bien y otro numero para los otros casos. Aunque en el ejemplo este funciona, no creo q sea una buena práctica retornar el resultado con return.
Por ahi estoy diciendo una pavada eh! ojo! ja!
La verdad me dejaste con la duda. En todo caso, para evitar problemas con las funciones podemos reemplazar el return por echo en el caso de que la función busque devolver o imprimir un valor o cadena.
Es cierto, para solucionar esto se puede usar el comando bc, en la función suma se puede usar: resultado=`echo $1+$2 | bc -ql`
Buenas,
Me gustaría saber donde puedo guardar los archivos bash para que se ejecuten en todo el sistema y que no sea el directorio bin, sino que pueda ser el home para hacer copias de seguridad.
Gracias y saludos.
Muchas gracías, estoy empezando con lo de los scripts, y la verdad que esto es muy útil, eres muy amable compartiendo tus conocimientos!
Saludos
Gracias! Abrazo!
Pablo
Syntax error: «(» unexpected
me sale error al tratar de correr el ejemplo , lo copie exactamente igual
que puede ser? estoy en ubuntu 14.10