Programación en Bash Linux III: Estructuras [if..then..else]

También es habitual que en nuestros scripts necesitemos de algún dato, mismo que puede ser tecleado por el usuario y que necesitemos guardar en una variable, para ello usaremos read.

Por ejemplo:

#!/bin/bash
echo -n "Cual es tu nombre: "
read NOMBRE
read -p "Cual es tu color favorito $NOMBRE: " COLOR
read -p "Cual es tu edad $NOMBRE: " EDAD

Obtendríamos una salida como:

Cual es tu nombre: jorge
Cual es tu color favorito jorge: negro
Cual es tu edad jorge: 18

Si quisiéramos jugar un poco mas con esta información tenemos a nuestra disposición estructuras de control como en todos los lenguajes de programación.

if..then..else

El uso de las condiciones te puede resultar muy familiar, así que mostrare unos sencillos ejemplos para que los identifiquemos.
Una condición sencilla:

if [ $COLOR = "negro" ]; then
	echo "El negro es un enigmático color, lleno de misterio."
fi

Una condición con else:

if [ $COLOR = "negro" ]; then
	echo "El negro es un enigmático color, lleno de misterio."
else
	echo "El color $COLOR no me gusta, me gusta mas el negro."
fi

Un ejemplo mas (aquí debes ser mas observador):

if [ $EDAD -ge 18 ]; then
	echo "Veo que ya eres mayor de edad."
else
	echo "Ya pronto serás mayor de edad."
fi

Como vemos, en las condiciones podemos usar los operadores que conocemos como >, <, =, pero en el último ejemplo el operador cambio a un -ge que sería el equivalente a >=, y si eres curioso y probaste intentar con un if [ $EDAD >= 18 ] te darás cuenta que al correr el script te arrojara un error en esa linea argumentando que esperaba un operador unario.

Por ello el uso del los atributos -ge (mayor o igual que), empero, si somos necios y queremos usar >=, pues lo haríamos usando dobles paréntesis y quedaría de la siguiente forma.

if (($EDAD >= 18)); then
	echo "Veo que ya eres mayor de edad."
else
	echo "Ya pronto serás mayor de edad."
fi

Aquí pongo una lista de los operadores que podemos usar:

  • Comparaciones entre números:
    • -eq: es igual a
    • -ne: no es igual
    • -gt: es mayor que
    • -ge: es mayor e igual que
    • -lt: es menor que
    • -le: es menor o igual que
    • <,>,<=,>=, = : los que conocemos
  • Comparación entre Cadenas:
    • =, ==: es igual a
    • !=: no es igual a
    • <: menor que
    • >: mayor que
    • -z: la cadena esta vacía
    • -n: la cadena no esta vacía
  • Operadores Lógicos:
    • -a: AND lógico
    • -o: OR lógico

En las condiciones también podemos trabajar para comprobar por ejemplo la existencia de un archivo, o bien, comparar si un archivo tiene permiso de escritura, o que se yo, algo que se nos ocurra.

ARCHIVO="script01"
if [ -f $ARCHIVO ]; then
	echo "el fichero $FILE si existe"
else
	echo "fichero no encontrado"
fi

8 Comments

  1. Posted May 31, 2009 at 1:59 pm | Permalink

    Deberías recomendar los espacios, siempre pasa que en algún if o uso de Corchetes se pega como [-f $archivo] a [ -f $archivo ] :P y como es costrosa ese error

  2. Posted May 31, 2009 at 2:26 pm | Permalink

    Andas con todo Jorge. ¡Qué ritmo de publicación!

    Por cierto, éxito en tu examen.

  3. Posted May 31, 2009 at 3:11 pm | Permalink

    Tienes razón, @Bucio, lo mismo al hacer una asignación NOMBRE = valor, que debe ser NOMBRE=valor sin espacios, si no, el error nos meterá en problemas.

    saludos !!

  4. gerardi
    Posted August 16, 2009 at 6:58 pm | Permalink

    genial aporte me encanto pido tu permiso para publicarlo en formato pdf como una guia para todos. o mejor hay que colaborar todos para hacer un buen manual que les parece es solo una idea pero ayudaria a todos

  5. Posted August 16, 2009 at 9:48 pm | Permalink

    @gerardi claro, por mi no hay ningún problema

  6. Pastor
    Posted October 17, 2009 at 6:32 pm | Permalink

    tremendo tutorial acerca de bash… Lastima que el tema 2 aparezca como invalido…

  7. Posted October 17, 2009 at 10:24 pm | Permalink

    @Pastor, como que aparece como invalido ??

  8. Jose
    Posted June 14, 2011 at 5:24 am | Permalink

    y si tengo:

    if [ -s "$CORE.$$.tmp ]

    que seria?

    saludos y gracias.

Post a Comment

Your email is never shared. Required fields are marked *

*
*