Bash Scripting – Iniciado 003 Final Round

Pues ahor si prestos, para la tercera y ultima parte de esta serie sobre scripting en bash para iniciados, por si te perdiste las dos primeras, usa esos links para vistarlas y matar la curiosidad; Bash Scripting – Iniciados 001 y Bash Scripting – Iniciados 002. esta vez analizare algunos elementos más que pueden ayudarte para generar scripts mejor desarrollados.

Comencemos por un concepto básico que puede parecer difícil, la función. Es una forma simple de poner una parte de un script que se usa una y otra vez en un grupo reutilizable. Así que pongamos una función en un archivo hola_mundo.sh, no olvides darle permiso de ejecución, chmod +x hola_mundo.sh.

!/bin/bash 

hola() {
echo "Saludos de una función"
}

#invocar la primera función hola() 
hola

Sí ejecutas el script hola_mundo.sh, devolvera el contenido de la función hola(), así:

$ ./hola_mundo.sh
Saludos de una función
$

Como haz podido apreciar, para una función se necesitará un nombre para esta, los paréntesis de apertura y cierre, además de corchetes para encerrar los comandos que se incluyen en la función. Como ya mencione arriba las funciones son una buena manera de reutilizar comandos, pero pueden ser más útiles si puede hacer que operen con diferentes datos cada vez que se usan, a estos datos se les llama argumentos.

Para proporcionar argumentos, simplemente agréguelos después del nombre de la función cuando la invoque. Para utilizar los datos que proporciona, utiliza las referencias de posición en los comandos de función. Se llamarán $1, $2, $3, etc., según la cantidad de argumentos que necesite su función. Con las modificaciones pertinentes, el script hola_mundo.sh quedaria así, si le agregas argumentos:

!/bin/bash

hola() {
echo "Saludos de una función"
echo $1
echo $2
echo "Ingresaste $# argumentos"
}

hola "¿Qué te parecio?" Sencillo

Ejecutado el script, devolveria algo así:

Saludos de una función
¿Qué te parecio?
Sencillo
Ingresaste 2 argumentos

Este resultado se puede explicar de forma sencilla (espero), la salida de la función hola() hizo un echo en cada línea. Primero hace una de la línea «Saludos de una función», luego continua la ejecución, haciendo un echo del valor de la variable $1, «¿Qué te parecio?». Ahora hacia la variable $2 y su respectivo valor, «Sencillo». La función terminará su proceso devolviendo el echo “Ingresaste $# argumentos”. Si fuiste perspicaz, notaste que el primer argumento era una sola cadena entre comillas dobles, mientras que el segundo argumento no tenia espacios, por lo que las comillas no eran necesarias.

Lo mismo con la variable $#, con la que puedes determinar la cantidad de argumentos que se pasan a la función.

Las Comparaciones Numéricas, puedes realizarlas gracias a los siguientes operadores, que deberan siempre estar incluidos entre corchetes [], si no te da error .

  • -eq (es igual)
  • -ge (igual o mayor que)
  • -gt (mayor que)
  • -le (menor o igual)
  • -lt (menor que)
  • -ne (no igual)

Para que se comprenda mejor, si queremos plasmar la comparación de 1 es igual a 1, en lenguaje script seria, [ 1 -eq 1 ]. O sí 1 es menor o igual que 1, [ 1 -le 1 ] y es tambien correcto pensar que pueden ser variables, como [ $uno -le $uno ]; como notas hay una separación entre el corchete y la expresión ya que es un comando.

También puedes utilizar dobles corchetes [[, para realizar tus comparaciones. Los dobles corchetes resultan ser una mejora respecto a los simples, ya que te libra de por ejemplo utilizar las comillas con las variables ya que trabaja mejor con los espacios, además te permite usar operadores especiales y comodines. Pero por un tema de compatibilidad entre distintos equipos, donde puede variar se sigue usando el corchete unico y no el doble. En el ejemplo siguiente veraz su uso, mas de cerca.

Una decalaración if en Bash comenzará con if y terminará con fi. A continuación del if seguira la comprobación que deseas hacer. En este caso, la verificación será la variable número uno igual a 1. Si el número uno es igual a 1, ejecutará la declaración entonces, de lo contrario ejecutará la declaración más.

!/bin/bash 

echo "Ingresar dos números, dejando un espacio entre ellos:"
read a b
echo "Los números a comparar son:
echo "a=$a"
echo "b=$b"

if [[ $a -eq $b ]]
then
echo "$a es igual a $b"
elif [[ $a -gt $b ]]
then
echo "$a es mayor que $b"
demás
echo "Ninguno de los enunciados coincide"
fi

Su salida se vera reflejada dependiendo del resultado de la comparación:

$ ./hola_mundo.sh
Ingresar dos números, dejando un espacio entre ellos:
1 2
Los números a comparar son:
a=1
b=2
Ninguno de los enunciados coincide

.....
1 1
...
1 es igual a 1

.....
2 1
...
2 es mayor que 1

Lo que está viendo es la primera línea en la declaración if que verifica si el valor de las variables son iguales. Si es así, la declaración es positiva, pues devuelve que ambas son iguales y termina . Si no ejecuta la declaración elif que compara las variables nuevamente y nos devuelve que $a es mayor que $b, si fuera ese el caso. Si ninguna coincide, pues devuelve una salida donde las variables no coinciden terminando la ejecucion del script. Cuando usa una declaración if o if/elif, funciona de arriba hacia abajo. Cuando la primera declaración es una coincidencia, se detiene y ejecuta ese comando y continúa después de la fi.

A continuación las comparaciones de cadenas, con esta utilizaremos si o si los corchetes dobles [[]] los operadores son:

  • == (igual)
  • != (no igual)
  • -n (la cadena no esta vacia)
  • -z (la cadena esta vacia)

Existes varias otras comparaciones con las cadenas que quedara para investigación personal, si quieren profundizar mas en el tema.

!/bin/bash 

echo "INGRESA DOS PALABRAS"
read -p "Primera Palabra: " string1
read -p "Segunda Palabra: " string2

if [[ "$string1" == "$string2" ]]
then 
echo "AMBAS SON IGUALES" 
else
echo "AMBAS SON DISTINTAS"
fi 

A CONSIDERAR: Utiliza un espacio en blanco entre el operador binario y los operandos. Utiliza siempre comillas dobles alrededor de los nombres de las variables para evitar la división de palabras o problemas de agrupamiento. Bash no separa las variables por «tipo», las variables se tratan como enteros o cadenas según el contexto.

Para finalizar, demosle un vistazo a los bucles, para esta ocasión sera while el elegido. Con la siguiente condición espero sea sea suficiente para poder comprenderla «mientras 1 es menor que 10, agregue uno al valor», continúe haciendo esto hasta que ya no sea cierto. Ahora el script:

!/bin/bash 
numero=0
while [ $número -le 10 ]
do
echo "Numero actual es $número, así que se incrementa una vez"
((número=número+1))
done
echo "Se completo el bucle ya que $número es mayor que 10."

Como vez en a parte del while que da vida al loop, tenemos a su lado los comparadores númericos -le, otorgando un sentido de incremento al bucle. la ejecución del bucle nos devuelve:

Numero actual es 0, así que se incrementa una vez
...
...
Se completo el bucle ya que 11 es mayor que 10.

La cantidad de secuencias de comandos necesarias para que esto suceda es mucho menor que si continuara verificando cada número con una declaración if. Esta es el gran aporte de los bucles, probablemente que tocare en algun otra entrada mas avanzada sobre bash scripting.

Conclusión

Ahora qué se genero con todo esta serie, espero yo un interés o mucha curiosidad por abrirse paso en el mundillo del scripting en bash, un peldaño mas que debes subir si quieres ahondar en temas mas profundos ya que te ayudar en demasia para multiples tareas IT en distintos niveles.

Hasta otro post lector, buenas vibras. Happy Hacking!


Lecturas Recomendadas

Bash Scripting Cheatsheet

The Bash Hackers Wiki

Bash Guide

Deja un comentario