| Artículos | 01 JUL 2000

Programación de Shell Scripts(y II)

Tags: Histórico
Javier Cáceres.
Se podría decir que la versatilidad del intérprete de comandos, junto con la potencia de las herramientas que lo acompañan “de serie”, elevan a la categoría de lenguaje de programación el entorno en el que se crean los shell scripts. Como todo lenguaje que se precie, dispone de sentencias condicionales, comparación de expresiones, bucles y funciones. Dedicaremos el artículo a éstas y otras características.

Crear shell scripts es algo conceptualmente muy similar a componer figuras con el famoso Lego, aquél con el que todos jugamos alguna vez en nuestra infancia. Recordemos que una pieza, por sí misma, apenas nos era útil y, sin embargo, esa misma pieza combinada con otras muchas, nos permitía crear objetos de una vistosidad y utilidad muy superiores. En este sentido, el valor del conjunto es mucho mayor que la suma de los elementos que lo componen. Algo parecido sucede con los comandos y herramientas presentes en todo sistema Unix. Como es natural, por sí mismos todos ellos gozan de un cierto grado de funcionalidad, pero sólo cuando son combinados con otros comandos o herramientas alcanzan su máximo potencial. Es decir, si bien podemos emplear cualquiera de estas utilidades por separado, todas ellas han sido diseñadas para entenderse de alguna forma con el resto de herramientas. La labor del sistema operativo en este punto consiste precisamente en canalizar, en proporcionar los medios precisos para que los distintos comandos se puedan llegar a entender. Conocer los mecanismos básicos con los que el sistema operativo gestiona estos aspectos es fundamental a la hora de crear shell scripts. Estos aspectos, quizás algo teóricos, ya fueron descritos con cierta profundidad en la entrega del número anterior, siendo sin duda la base indispensable sobre la cual empezar a construir estos “archivos batch” del Unix. En un primer momento, el código que contiene un shell script puede antojársenos algo críptico, pero pese a lo que pueda parecer, crear shell scripts básicos no es algo excesivamente complejo. La sintaxis de las estructuras que veremos a continuación, de tener alguna experiencia en el campo, sin duda nos van a recordar a las de múltiples lenguajes de programación. Como todo lenguaje que se precie de serlo, los intérpretes de comandos incorporan la gestión de sentencias condicionales, comparación de expresiones, bucles, funciones, etc., todas ellas características imprescindibles de las que hablaremos con cierta profundidad en el presente artículo. Igualmente, dada la orientación práctica con la que hemos querido caracterizar esta entrega (en contraposición a la primera, de índole más teórico), en última instancia comentaremos algunos ejemplos que nos puedan dar una idea de cómo comenzar nuestros propios proyectos en un futuro.

Operadores condicionales
Se podría considerar que los operadores condicionales son los elementos realmente indispensables de un lenguaje de programación. Un operador condicional nos va a permitir realizar un cambio en la línea de ejecución, una bifurcación en la ejecución de nuestro programa en función de una o varias condiciones o circunstancias que varían en tiempo de ejecución. En otras palabras, un operador condicional decide qué parte del código ha de ser ejecutado en base a unas condiciones especificadas. Si no pudiéramos contar con este recurso, los programas no podrían en ningún caso cambiar de estado ni responder a ningún tipo de entrada que se produjera. En el entorno que hoy nos ocupa, y en otros muchos, esta función la realizan los comandos if y case. La sentencia if evalúa el estado de una expresión lógica y, en función de ésta, ejecuta el código contenido en una de sus dos ramas. La sintaxis básica de este comando es:
if [ expresión1 ] then
<sec. instrucc. 1>
elif [ expresión2 ] then
<sec. instrucc. 2>
else
<sec. instrucc. 3>
fi
Donde expresión1 y expresión2 son el resultado de una función que devuelve un valor de true (cierto) o false (falso). Si el valor de expresión1 resulta cierto, se procederá a ejecutar la secuencia de instrucciones 1. En caso contrario, si expresión2 devuelve cierto, la secuencia a ejecutar será la número 2, mientras que la secuencia 3 llegará a ser ejecutada sí y solo sí, tanto expresión1 como expresión2 han resultado falsas. Tales expresiones muy comúnmente son el resultado de alguna comparación lógica, de las que hablaremos más adelante. Los bloques if no precisan contar con las partes elif (contracción de else if, expresión también válida), o else, pueden utilizarse independientemente. Igualmente pueden anidarse; esto es, incluir bloques if dentro de la secuencia de instrucciones de una rama if precedente.
La segunda alternativa, case, es más indicada para los casos en los que el código a ejecutar dependa de muchas opciones. En esencia es una alternativa elegante a secuencias de elif cuando se evalúa siempre una misma expresión. Obviando la sintaxis, el siguiente código:
case $1 in
L | l) echo “Es lunes”;;
M | m) echo “Es martes”;;
X | x) echo “Es miércoles”;;
*) echo “no sé que día es”;;
esac
Donde antes del paréntesis ) se separan mediante pipes o tuberías |, los distintos valores que, de ser los contenidos en la variable $1 acabarán con la ejecución de las sentencias que vengan después del paréntesis y antes del ;;. El carácter reservado * de la penúltima línea representa el resto de valores; es decir, lo que hay que hacer cuando no se han dado ninguna de las combinaciones anteriores. esac, por su parte, es el indicador del final del bucle y, como lo fuera fi en el bloque if, no es más que case al revés. Este ejemplo analiza la primera palabra que acompañe al script que lo contenga ($1). Si es l o L, muestra Es lunes, si es M o m Es martes, Es miércoles para X o x, y no sé que día es en cualquier otro caso.

Comparación de expresiones
La comparación de todo tipo de expresiones puede realizarse de dos maneras distintas y se divide en cuatro bloques fundamentales: comparación de cadenas, comparación de números, análisis de archivos y operadores lógicos.
Recordemos que una de las primeras cosas que tuvimos ocasión de estudiar el mes pasado fueron las variables y la forma en que se les asignaba un cierto valor. Quedó entonces patente que las variables pueden recibir cualquier tipo de valor, ya sea éste un dato numérico (de tipo entero) o una cadena de texto. Ahora es momento de dar un paso adelante y estudiar si, aparte de contener un valor, las variables tienen una cierta entidad y, como entidades, son comparables a otras de su misma índole. Básicamente las variables pueden contener bien números, bien cadenas de texto. Sobre las variables numéricas vamos a poder realizar tanto comparaciones como operaciones matemáticas simples de las que hablaremos en próximos apartados. En cuanto al tratamiento de cadenas de texto, el soporte es bastante completo y se puede realizar prácticamente cualquier tipo de comparación entre variables de esta clase.
En la tabla 4 encontraremos referencia a los distintos operadores, según categorías, que nos van a permitir comparar expresiones. Decíamos que hay dos formas distintas de comparar una variable o expresión con ot

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información