Estructuras Condicionales en Shell Scripting
La estructura if podemos ampliarla usando la construcción else (en caso contrario) y elif (en caso contrario si…).
Estructura Simple IF…ELSE
La estructura simple de else es la siguiente:
if [ expresión 1 ]; then
# Realizar si expresión 1 es verdadera
else
# Realizar si expresión 1 es falsa
fiEstructura IF…ELIF…ELSE
Una estructura con elif (else if) tiene la siguiente forma:
if [ expresión1 ]; then
# Realizar si expresión1 es verdadera
elif [ expresión2 ]; then
# Realizar si expresión1 es falsa, pero expresión2 es verdadera
elif [ expresión3 ]; then
# Realizar si exp1 y exp2 son falsas, pero expresión3 es verdadera
else
# Realizar si todas las expresiones anteriores son falsas
fiConsideraciones Cruciales y Errores Comunes
Hay que tener muchísimo cuidado con los espacios en blanco, y seguramente durante nuestros primeros scripts casi todos los errores vendrán por haberlos usado mal en las estructuras if.
Hay que recordar que los corchetes llevan espacios en blanco tanto a izquierda como a derecha, que el punto y coma sin embargo va pegado al corchete cerrado, y que SIEMPRE hay que poner espacios en blanco en las expresiones.
Ejemplos de Errores Frecuentes
Veamos algunos errores muy comunes, para que no los cometáis:
Error de Espaciado en Corchetes:
If [3 -eq 5 ]; thenResultado: bash: [3: command not found.
Explicación: Hemos usado
[3en lugar de[ 3. Falta el espacio después del corchete de apertura.Uso Incorrecto de Operadores de Cadena para Números:
if [ “Jose” -eq “Jose” ]; thenResultado: Bash: [: jose: integer expression expected.
Explicación: Debíamos haber usado
=para comparar cadenas, o-eqpara comparar números. En este caso, el intérprete espera una expresión numérica debido al uso de-eq.Uso Incorrecto de Operadores Numéricos:
if [ 3 = 4 ]; thenExplicación: Esto no nos devolverá error, y parece que funciona, pero en realidad no es así. Para comparación numérica, hay que usar
-eq.Uso de Operadores de Redirección en Condicionales:
if [ 3 > 4 ]; thenExplicación: El símbolo
>es un operador de redirección en Bash, no un operador de comparación dentro de[ ]. Se debe usar-gt(greater than).Falta de Espacios en la Condición de Cadena:
If [ jose=Antonio ]; thenExplicación: No hemos dejado espacios en la condición
=. Esta expresión da como valor verdadero, ya que Bash la interpreta como una única cadena no vacía. Mucho cuidado con este error, que nos puede volver locos en depuración.
Error Común por Variables Nulas
Otro error muy común es el siguiente, causado por un error tipográfico en el nombre de la variable:
#!/bin/bash
PROFESOR=”Juana”
if [ $PROFSOR = “Juana” ]; then
echo “Hola Juana”
fiEste programa nos devuelve por pantalla el siguiente error:
bash: [= unary operator expected
Que traducido resulta: me he encontrado un [ (corchete abierto) y luego un operador (el =) sin nada en medio, y eso no funciona.
Revisando el programa anterior, vemos cómo nos hemos equivocado en el nombre de la variable ($PROFSOR en lugar de $PROFESOR), por lo cual $PROFSOR no tiene ningún valor (es nula). Al no valer nada, el programa lo que ve es lo siguiente: if [ = “Juana” ], lo cual es sintácticamente incorrecto.
Operaciones Condicionales Usando test
Hemos visto operadores aritméticos y operadores para cadena, pero en las expresiones podemos utilizar cualquier operación que nos devuelva un valor lógico (0 para verdadero). Por ejemplo, podemos usar la función test del Bash, que funciona de la siguiente forma:
Operadores de Prueba de Ficheros (File Test Operators)
-a fichero- Verdadero si fichero existe.
-d fichero- Verdadero si fichero existe, y es un fichero de tipo directorio.
-f fichero- Verdadero si fichero existe, y es un fichero regular.
-r fichero- Verdadero si fichero existe y se puede leer.
-w fichero- Verdadero si fichero existe y se puede escribir.
-x fichero- Verdadero si fichero existe y se puede ejecutar.
fichero1 -nt fichero2- Verdadero si fichero1 es más nuevo que fichero2.
fichero1 -ot fichero2- Verdadero si fichero1 es más viejo que fichero2.
Anidamiento de Expresiones y Operadores Lógicos
Si lo necesitamos, podemos anidar expresiones usando tanto AND (y, &&) como OR (o, ||).
Operador AND (&&)
if [ expresión1 ] && [ expresión2 ]; then
# Se ejecuta si expresión1 Y expresión2 son verdaderas
fiOperador OR (||)
if [ expresión1 ] || [ expresión2 ]; then
# Se ejecuta si expresión1 O expresión2 son verdaderas
fiOperador NOT (!)
También podemos usar el operador NOT (!) para indicar una negación.
if ! [ expresión1 ]; then
# Se ejecuta si expresión1 NO es verdadera
fiInteracción con el Usuario: El Comando read
Para hacer algunos ejercicios, vamos a aprovechar para explicar mejor cómo le podemos pedir datos al usuario. Se hace con la orden read y es muy simple de usar:
read -p “texto de la pregunta” variableLa ejecución del script se parará, mostrará por pantalla el texto de la pregunta, y dejará que el usuario escriba la respuesta. Cuando pulse INTRO, la respuesta dada se introducirá como valor de variable.
El comando read también puede ser usado sin el parámetro -p, de la forma read variable. También podemos hacer que lea un determinado número de caracteres, sin obligar a que el usuario pulse intro, con el parámetro -n número_de_caracteres. El parámetro -s silencia el eco (no se ve por pantalla lo que el usuario escribe).
Ejemplo Práctico: Determinar Par o Impar
Ahora que sabemos usar el read, hagamos por ejemplo un programa que nos permita indicar si un número introducido es par o impar.
#!/bin/bash
# parimpar.sh - script que nos pide un número e indica si es par o impar.
clear
read -p “Introduzca un número : “ NUMERO
# Usamos 'let' para realizar la operación aritmética de módulo
let RESTO=NUMERO%2
if [ $RESTO -eq 0 ]; then
echo “El número $NUMERO es par”
else
echo “El número $NUMERO es impar”
fiContexto Académico
TEMA 11 | I.S.O. Linux. Shell Scripts. IMPLANTACIÓN DE SISTEMAS OPERATIVOS. CURSO 2012/2013
