Programando en Bash – parte 3

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 = $?";

< < Ir a la anterior parte

¡Gracias Juan Carlos Ortiz!


7 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Puntero Nill dijo

    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!

  2.   Juank dijo

    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.

  3.   Abel S.Monte grande dijo

    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`

  4.   Luis Miguel dijo

    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.

  5.   Joaquin dijo

    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

    1.    usemoslinux dijo

      Gracias! Abrazo!
      Pablo

  6.   CRISTHIAN dijo

    Syntax error: «(» unexpected
    me sale error al tratar de correr el ejemplo , lo copie exactamente igual

    que puede ser? estoy en ubuntu 14.10