|
Condiciones particulares
Hay dos condiciones que son relativamente comunes, que son ejecutar un
código si algo inmediatamente anterior ha ido bien, o justo lo contrario, ejecutarlo
sólo si lo anterior ha ido mal.
Por ello, hay dos "estructuras" que nos permiten manejar
estas situaciones de una forma más cómoda y limpia. Estas estructuras son && y
||. Para las personas que hayan programado en C, les resultarán familiares. El &&
es el equivalente a la palabra reservada de Pascal and y || es el equivalente del or en
Pascal.
La forma de acordarse de qué produce cada estructura, es pensar que el
shell sólo va a ejecutar lo estrictamente necesario para saber cómo termina la
condición. Sabemos que false && cualquiercosa da falso, y que true ||
cualquiercosa da verdadero, así que eso es lo que va a hacer el shell: si utilizamos la
estructura &&, el shell ejecutará la primera instrucción, y sólo si va bien (si
devuelve un cero) ejecutará la segunda, y análogamente con la estructura ||, el shell
ejecutará la primera instrucción, y sólo ejecutará la segunda si la primera ha ido
mal, es decir, si el valor de la condición total depende de lo que pase al ejecutar la
segunda instrucción.
La estructura && puede utilizarse cuando ejecutemos una
instrucción cuyo trabajo depende de que la primera haya ido bien, y la || puede
ejecutarse para dar mensajes de error.
Estructura case
La estructura case del bourne shell y compatibles es una estructura
parecida a la de Pascal:
cuando entra en la estructura, sale cuando empiece la siguiente
etiqueta (no así en C, en el que las etiquetas del case actúan como etiquetas de un JMP
en ensamblador: una vez que entran en una etiqueta, no salen del case hasta que éste
acaba completamente).
Las etiquetas pueden ser cualquier expresión regular válida, con lo
que se puede poner un * como última etiqueta del case para actuar como else. Para indicar
que termina el código de una etiqueta determinada, hay que poner al final de la última
orden dos signos de punto y coma seguidos.
La estructura general del case es:
case valor
in
expreg1)
...
ultimaorden1;;
expreg2)
...
ultimaorden2;;
...
expregn)
...
ultimaordenn;;
esac
Estructura while
La estructura básica para construir bucles. La sintaxis es:
while orden
do
...
done
En orden podemos poner una orden normal y corriente (el bucle se
ejecutaría mientras la orden devolviera un cero), o podríamos también poner una
condición, con la orden test (o mejor, con la sintaxis alternativa []), que por otra
parte no deja de ser una orden como otra cualquiera.
Estructura for
Es otra de las estructuras importantes en los lenguajes de
programación. Es más versátil que el equivalente de Pascal, pero menos que el
equivalente de C (como era lógico, por otra parte).
Es una estructura que permite dos sintaxis: La primera, la del for más
o menos tradicional, es decir, dar el nombre de una variable y los valores por los que
tiene que "pasar", es la siguiente:
for variable in expreg1 expreg2 ...
do
...
done
Hay una pequeña diferencia respecto a los bucles normales for, y ésta
es que los valores por los que pasa la variable variable tenemos que especificarlos uno a
uno (mediante expresiones regulares). Las expresiones regulares se intentarán hacer
coincidir con los nombres de los ficheros del directorio actual.
La segunda sintaxis que permite el bucle for es una sintaxis sin lista.
Si utilizamos esta sintaxis, el shell lo interpretará como que la lista que queremos es
la de todos los parámetros dados al script desde la línea de comandos (u otro script o
programa). La sintaxis queda:
for variable
do
...
done
Estructura until
Esta estructura es parecida a la while, aunque la condición la damos
"al revés", es decir, que el bucle se ejecuta mientras la condición a testear
sea falsa, y termina cuando sea verdadera. Tiene una utilidad diferente que en los
lenguajes de programación. Normalmente se utiliza en los lenguajes de alto nivel para
forzar la ejecución del bucle al menos una vez, aunque la condición sea desde el
principio verdadera. No se puede utilizar de esa manera en la programación en shell,
porque la sintaxis tiene la condición al principio.
Pero sirve para otra cosa: recordemos que cuando queremos chequear el
valor devuelto por un programa, ponemos el nombre del programa y los parámetros
directamente en la condición de la estructura while o la que sea: si queremos ejecutar un
bucle mientras un programa devuelva un valor distinto de cero, entonces debemos utilizar
la estructura until, porque no podemos negar el valor devuelto por un programa (al menos
que yo sepa).
La sintaxis es como sigue:
until orden
do
...
done
Rompiendo la ejecución normal de los bucles
Algunas veces necesitamos romper la ejecución normal de los bucles.
Quizás queramos saltarnos lo que queda de iteración, o quizás necesitemos en un momento
dado salir del bucle.
Las dos órdenes utilizadas en la programación en shell para hacer
estas cosas son las dos mismas que se utilizan en lenguaje C, y se utilizan de la misma
manera: break y continue.
La primera sirve para salir del bucle y seguir la ejecución del
programa, y la segunda sirve para saltarnos lo que queda de iteración y empezar la
siguiente. Antes de empezar con la siguiente iteración, se volverá a chequear la
condición (supongo).
|