next up previous contents
Next: case Up: Condicionales Previous: Condicionales   Índice General

if-then-else

Volviendo un poco a nuestro ejemplo del corrector ortográfico para pobres5.3, qué pasa cuando corremos co si no existe el diccionario? Pues que truena espantosamente:

comm: diccionario: No such file or directory

Es claro que debemos de tener una manera de saber de antemano si el diccionario existe y avisar nosotros de éste error o tomar una acción adecuada. Bueno, el shell nos proporciona con un mecanismo para hacer preguntas y tomar decisiones y además para averiguar cosas acerca de archivos. Vayamos por partes.

Para preguntar y tomar decisiones tenemos, como en los lenguajes de programación para gente grande, la estructura de control if-then-else que nos permite examinar una condición y tomar una acción en caso de ser cierta u otra en caso de ser falsa. La sintáxis correcta es la siguiente:

if condicion
then
        accion_condicion_verdadera_1
        accion_condicion_verdadera_2
        ...
else
        accion_condicion_falsa_1
        accion_condicion_falsa_2
        ...
fi

Al igual que en los lenguajes de alto nivel, la parte del else puede no ir.

Para probar el valor de verdad de la parte condicionante tenemos el comando test. Para el ejemplo que estamos desarrollando, de momento nos basta con saber que podemos preguntar por la existencia de un archivo con el modificador -e de test. También podemos preguntar si el tamaño del archivo es de más de 0 carácteres, ya que no nos basta con saber que existe, sino que además debemos de garantizar que hay palabras en el diccionario. Esto lo podemos ver con el modificador -s. Además, como somos bien hechos, queremos garantizar que el archivo es legible para el usuario ejecutando nuestro fabuloso programa, y lo podemos saber con la opción -r. Ahora bien, estamos hablando de tres preguntas, test nos permite también pegarlas con conjunciones lógicas y y o con -a y -o respectivamente. Para este ejemplo necesitamos que las tres condiciones se cumplan, así que utilizaremos dos conjunciones y. Así, luego de todas estas provisiones, podemos aumentar nuestro programa co de la siguiente manera:

if test -e diccionario -a -s diccionario -a -r diccionario
then
        cat $1 | tr -c 'a-zA-Z\341\351\355\363\372\361' ' ' | \
        tr ' \t' '\n' | sort | uniq | comm -23 - diccionario | more
else
        echo "No existe el diccionario, o no lo puedo leer, o no"
        echo "contiene palabras."
        echo "Tomese dos aspirinas y llameme si persisten las molestias."
fi

Ahora ya tenemos una solución para cuando hay problemas con el diccionario. No es muy buena, pero es una solución. Incluso hay gente que se gana la vida dando respuestas como éstas.


Tabla: Modificadores de test. En el caso de las expresiones aritméticas, el modificador -l precediendo a una cadena se refiere a su longitud.
Modificador Significado
-d nombre Verdadero si el archivo existe y es un directorio
-e nombre Verdadero si el archivo existe
-f nombre Verdadero si el archivo existe y es un archivo regular
-L nombre Verdadero si el archivo existe y es una liga simbólica
-r nombre Verdadero si el archivo existe y es legible
-s nombre Verdadero si el archivo existe y no está vacio
-w nombre Verdadero si el archivo existe y es escribible por el usuario
-x nombre Verdadero si el archivo existe y es ejecutable
arch1 -nt arch2 Verdadero si arch1 es más reciente que arch2
arch1 -ot arch2 Verdadero si arch1 es más viejo que arch2
-z cadena Verdadero si la longitud de la cadena es cero
-n cadena Verdadero si la longitud de la cadena es mayoor que cero
cadena1 = cadena2 Verdadero si las cadenas son iguales
cadena1 != cadena2 Verdadero si las cadenas son distintas
! expr Verdadero si la expresión es falsa
expr1 -a expr2 Verdadero si ambas expresiones son verdaderas
expr1 -o expr2 Verdadero si alguna de las expresiones es verdadera
   
  Expresiones aritméticas, arg1 y arg2 son números:
   
arg1 -eq arg2 Verdadero si son iguales
arg1 -ne arg2 Verdadero si son diferentes
arg1 -lt arg2 Verdadero si el primero es menor
arg1 -le arg2 Verdadero si el primero es menor o igual
arg1 -gt arg2 Verdadero si el primero es mayor
arg1 -ge arg2 Verdadero si el primero es mayor o igual


En la tabla [*] podemos ver una lista de las opciones de test.


next up previous contents
Next: case Up: Condicionales Previous: Condicionales   Índice General
Ismael Olea 2001-04-21