Saltar al contenido principal
Página

Tema 2.8 - Estructuras de control y Bucles

Comparando en bash

Para comparar en Bash se utiliza test o Ambos son totalmente equivalentes, y ambos están implementados en el propio Bash. En el caso [, por cuestiones prácticas es obligatorio también utilizar su pareja ] o de otra forma te da error. Esta es la razón para que tenga que estar separado el corchete de la expresión que viene a continuación, porque es un comando.

Por otro lado, también puedes utilizar dobles corchetes [[, para realizar tus comparaciones. Los dobles corchetes resultan ser una mejora respecto a los simples. Así, las diferencias entre uno y otro son las siguientes,

  1. No tienes que utilizar las comillas con las variables, los dobles corchetes trabajan perfectamente con los espacios. Así [ -f "$file" ] es equivalente a [[ -f $file ]].
  2. Con [[ puedes utilizar los operadores || y &&, así como<y>` para las comparaciones de cadena.
  3. Puedes utilizar el operador =~ para expresiones regulares, como por ejemplo [[ $respuesta =~ ^s(i)?$ ]]
  4. También puedes utilizar comodines como por ejemplo en la expresión [[ abc = a\* ]]


Es posible que te preguntes por la razón para seguir utilizando [ simple corchete en lugar de doble. La cuestión es por compatibilidad. Si utilizas Bash en diferentes equipos es posible que te encuentres alguna incompatibilidad. Así que depende de ti y de donde lo vayas a utilizar. Para el curso utilizaremos los corchetes simples [


Comparaciones De Cadenas Alfanuméricas

Operador		Verdad (TRUE) si:
------------------------------------------
cadena1 = cadena2	cadena1 es igual a cadena2
cadena1 != cadena2	cadena1 no es igual a cadena2
cadena1 < cadena2	cadena1 es menor que cadena2
cadena1 > cadena 2	cadena1 es mayor que cadena 2
-n cadena1		cadena1 no es igual al valor nulo (longitud mayorque 0)
-z cadena1		cadena1 tiene un valor nulo (longitud 0)

Comparación De Valores Numéricos
Operador		Verdad (TRUE) si:
------------------------------------------
x -lt y			x menor que y
x -le y			x menor o igual que y
x -eq y			x igual que y
x -ge y			x mayor o igual que y
x -gt y			x mayor que y
x -ne y			x no igual que y

Comprobación De Atributos De Fichero
Operador		Verdad (TRUE) si:
------------------------------------------
-d fichero		fichero existe y es un directorio
-e fichero		fichero existe
-f fichero		fichero existe y es un fichero regular (no un
			directorio, u otro tipo de fichero especial)

-r fichero		Tienes permiso de lectura en fichero
-s fichero		fichero existe y no esta vacio
-w fichero		Tienes permiso de escritura en fichero
-x fichero		Tienes permiso de ejecucion en fichero (o de busqueda
			si es un directorio)

-O fichero		Eres el dueño del fichero
-G fichero		El grupo del fichero es igual al tuyo.

fichero1 -nt fichero2	fichero1 es mas reciente que fichero2
fichero1 -ot fichero2	fichero1 es mas antiguo que fichero2


A modo de resumen, la siguiente tabla presenta los operadores utilizados en los distintos tipos de expresiones BASH.



Estructuras condicionales.

La estructura condicional sirve para comprobar si se ejecuta un bloque de código cuando se cumple una cierta condición. Pueden anidarse varias estructuras dentro del mismo bloque de código, pero siempre existe una única palabra fi para cada bloque condicional.


Estructura Condicional Simple


Condicional IF

La sentencia if EXPRESION, significa, Si se cumple la expresión condicional se ejecuta el bloque de sentencias seguidas.

En Bash podemos controlar qué partes de nuestro script se ejecutan usando un if. En la condición podemos usar comparaciones entre valores, expresiones complejas o el valor de salida de un programa. El formato del if puede ser implementado de las siguientes maneras:

if [ condicion1 ]
then
     comando1
     comando2 
     .... 
fi

Ó
if test var == value
then
     comando1
     comandoN
fi

Ó
if [ condition ]; then
    comando1
    comandoN
fi

Ó
if test -f /file/exists
then
    comando1
    comandoN
fi

NOTA: En bash el cero se toma como verdadero y un valor distinto de cero como falso.

Ejemplo: Comprobar si existe un fichero


Este script comprueba si existe el fichero fichero_prueba, en este caso se crea antes del condicional para verificar que si ingrese a la estructura de control.

La comprobación se hace a través de: -f fichero_prueba.


Ejemplo: Comparar cadenas de texto

Podemos ver si dos cadenas de texto son iguales usando el operador '==':



Ejemplo: Comparar números

Para ver si dos números son iguales usamos -eq (de equal en inglés):



Ejemplo: Negación

Si a una condición verdadera le ponemos el símbolo '!' delante se convierte en falsa. Si hacemos lo mismo con una condición falsa se convierte en verdadera. Por ejemplo




Condicional IF THEN ELSE

También podemos ejecutar un bloque de código si la condición no se cumple con un if-else:
#!/bin/bash

if [ "$command" == "$command2" ]
then
	echo "Cumple la condicion"
else
	echo "No cumple la condicion"
fi


Ejemplo:

Verificar si se ingresa la contraseña correcta, si es correcta o incorrecta indicarlo por medio de un mensaje



Estructura condicional compleja


IF ELIF ELSE

También podemos usar el elif que nos permite comprobar si se cumplen varias condiciones. Si no se cumple la del if se comprueba la del elif, si ésta tampoco cumple se ejecuta el bloque del else:

#!/bin/bash

if [ condition ]
then
	echo "Cumple la condicion"
elif [ other_condition ]
then
	echo "Cumple la otra condicion"
else
	echo "No cumple ninguna condicion"
fi

Ejemplo



IF ANIDADO

También podemos meter un if dentro de otro:
if [ condicion1 ]
then
     .............
     if [ condicion2 ]
     then
            ............
     else
             ......
     fi
  else 
  .........
fi

Ejemplo



Operadores Booleanos

Puede vincular dos comandos en bash shell mediante la ejecución condicional basada en el estado de salida del último comando. Esto es útil para controlar la secuencia de ejecución del comando.

<<       desplazamiento de 1 bit hacia la izquierda que equivale a multiplicar por 2.
>>       desplazamiento de 1 bit hacia la derecha, que equivale a dividir por 2.
<<=     desplazamiento de 2 bits hacia la izquierda que equivale a multiplicar por 4.
>>=     desplazamiento de 2 bits hacia la derecha, que equivale a dividir por 4.
        operación and
          operación or
^          operador xor
!           operador de negación (NOT)


Operadores Lógicos

El bash admite las siguientes dos ejecuciones condicionales

  1. AND lógico &&: ejecute el segundo comando solo si el primero tiene éxito.
  2. O lógico || - Ejecute el segundo comando solo si el primero no tiene éxito.

Operador Lógico y (&&)

es un operador booleano. Puede ejecutar comandos o funciones de shell en función del estado de salida de otro comando.

Sintaxis
comando1 && comando2

comando2 se ejecuta si, y solo si, comando1 devuelve un estado de salida de cero (verdadero). En otras palabras, ejecute comando1 y, si tiene éxito, ejecute comando2.

Ejemplo:
rm /tmp/filename && echo "Archivo Eliminado."


Operador lógico O (||)

es un operador booleano. Puede ejecutar comandos o funciones de shell en función del estado de salida de otro comando.

Sintaxis
comando1 || comando2

comando2 se ejecuta si, y solo si, comando1 devuelve un estado de salida distinto de cero. En otras palabras, ejecute comando1 con éxito o ejecute comando2.

Ejemplo:
cat /etc/shadow 2>/dev/null || echo "Error al abrir el archivo"


Operador lógico NOT

not (!) Es un operador booleano, que se utiliza para probar si la expresión es verdadera o no. Por ejemplo, si el archivo no existe, muestre un error en la pantalla.

Sintaxis
! expression

Ó
[ ! expression ]

Ejemplo: Crear un directorio /backup si este no existe.
[ ! -d /backup ] && mkdir /backup



Estructura Selectiva


Es una estructura de control condicional, que permite definir múltiples casos que puede llegar a cumplir una variable cualquiera, y qué acción tomar en cualquiera de estas situaciones, incluso es posible determinar qué acción llevar a cabo en caso de no cumplir ninguna de las condiciones dadas.

Las posibles opciones soportadas por la estructura selectiva múltiple se expresan mediante patrones, donde puede aparecer caracteres comodines, evaluándose como una expansión de ficheros, por lo tanto, el patrón para representar la opción por defecto es el asterisco (*). Dentro de una misma opción pueden aparecer varios patrones separados por la barra vertical (|), como en una expresión lógica O.

Si la expresión que se comprueba cumple varios patrones de la lista, sólo se ejecuta el bloque de código correspondiente al primero de ellos, ya que la evaluación de la estructura se realiza en secuencia.


Sintaxis:
case  $variable_name  in
                patron1)       
     		    command1
                    ...
                    ....
                    commandN
                    ;;
                patron2)
     		    command1
                    ...
                    ....
                    commandN
                    ;;            
                patronN)       
     		    command1
                    ...
                    ....
                    commandN
                    ;;
                *)   
                    commandDefault
                    ;;
esac 

Ejemplo:



BUCLES


Los bucles son estructuras reiterativas que se ejecutan repetitivamente, para no tener que teclear varias veces un mismo bloque de código. Un bucle debe tener siempre una condición de salida para evitar errores provocados por bucles infinitos.

La siguiente tabla describe las 2 órdenes especiales que pueden utilizarse para romper el modo de operación típico de un bucle.



BREAK:

Utilice la instrucción break para salir de un bucle FOR, WHILE o UNTIL, es decir, detener la ejecución del bucle.

Sintaxis
break


CONTINUE:

La instrucción continue se usa para reanudar la próxima iteración del ciclo FOR, WHILE o UNTIL que lo encierra.

Sintaxis
continue

Ó
[ condition ] && continue

Ejemplo:
#!/bin/bash
i=0
while [ $i -lt 6 ]
do
	(( i++ )) #Incremento la variable en 1
	[ $i -eq 3 -o $i -eq 6 ] && continue 
	echo "$i"
done



Bucle FOR


El bucle FOR se utiliza para repetir una o más instrucciones un determinado número de veces. De entre todos los bucles, el FOR se suele utilizar cuando sabemos seguro el número de veces que queremos que se ejecute. La sintaxis del bucle for se muestra a continuación.

for variable in lista_valores
do
    acciones_a_realizar
done

Ejemplo



Suele ser habitual el uso del comando externo seq para generar una lista de valores. Si bien este comando no está recogido en el estándar POSIX, es habitual su presencia en la mayoría de los sistemas UNIX. El comando seq presenta la sintaxis:

`seq valor_inicial valor_final`

siendo ambos valores números enteros. La salida del comando es la secuencia de números enteros entre ambos valores extremos indicados.

Nota: Debe utilizar comillas de acento grave ( `` ) antes de la palabra seq y después del límite superior de la lista que asigno.

Ejemplo




Bucles condicionales: WHILE y UNTIL


Bucle While

Un bucle while permite repetir la ejecución de un grupo de instrucciones mientras se cumpla una condición (es decir, mientras la condición tenga el valor True).

Sintaxis:
while condicion
do
	instrucciones
done


Ejemplo

Un ejemplo simple con while en donde imprimimos una variable y luego a este valor se le suma 2 hasta que el numero sea menor o igual que 15



Bucle UNTIL:

Until, es una instrucción de control que sirve para generar bucles, en los cuales grupos de instrucciones dentro de un bloque se ejecutan de forma repetida hasta que se cumpla una condición.

Cabe destacar que until, primero comprobará si se cumple la condición y si se cumple y sólo si se cumple entonces finaliza la secuencia de las instrucciones contenidas entre do y done.

Cada vez que se ejecuta un bucle completo (paso de bucle) vuelve a verificar si se cumple la condición antes de volver a ejecutar otro paso de bucle.

Sintaxis:
until condicion
do
	instrucciones
done

Un ejemplo simple con until en donde escribimos el valor de una variable 10 veces, después de incrementar su valor:



Bucle Select

El bucle de selección proporciona una manera fácil de crear un menú numerado desde el cual los usuarios pueden seleccionar opciones. Es útil cuando necesita pedirle al usuario que elija uno o más elementos de una lista de opciones.

  • El comando de selección utiliza la variable PS3 para imprimir su solicitud.
  • Cada palabra en la lista se imprime en la pantalla precedida por un número.
  • Si la línea está vacía, las PALABRAS y el mensaje se vuelven a mostrar.
  • Si se lee EOF (final del archivo), se completa el comando.

Sintaxis:

select varName in list
do
   command1 
   commandN
done

Ó
select varName in word1 word2 ... wordN
do
     instrucciones
done

Ejemplo


Última modificación: lunes, 11 de mayo de 2020, 22:15