Índice del artículo

La programación en shell de Unix es muy útil para realizar tareas de administración o para ejecutar una serie de comandos que se llevan a cabo de manera periódica o repetida. Una buena programación en Shell de Unix, nos puede ahorrar horas de trabajo, combianada con la funcionalidad del comando cron es aún más útil.

¿Que es un programa en Shell?

Los archivos de programación shell o scripts son archivos de texto plano (es decir texto tal cual se escribe), sin ninguna compilación ni proceso posterior para obtener un programa ejecutable. Es un conjunto de comandos de línea que se ejecutan en orden consecutivo como son escritos siguiendo los lineamientos de las estructuras de control que sean programadas en el script.

Es recomendable tener noción (por lo menos básica) de los comandos del Sistema Operativo, para lo cual podrías consulta nuestro Tutorial de Unix.

Para que tengas una idea un poco más clara de como se hace un programa en Shell, inicia tu sesión en Unix y crea un archivo con el siguiente contenido.

echo Este es mi primer programa en shell
echo y me muestra la ruta donde estoy
pwd

Guárdalo con el nombre programa1.sh y desde la linea de comando lo puedes ejecutar con la siguiente instrucción:

sh programa1.sh

y la salida debe ser algo como esto:

Este es mi primer programa en shell
y me muestra la ruta donde estoy
/export/home/


Sintáxis de la programación shell

En esta sección abordamos algunos aspectos de la sintaxis adecuada para la programación en shell y también mencionamos el uso de algunos comandos.

Primera línea del archivo

Es recomendable escribir en la primera línea del archivo la ruta del shell que se está utilizando, como el ejemplo:

#!/bin/bash

Aunque es una recomendación, si no está esa línea del archivo el script seguramente funcionará.

Comentario

Para tener una línea comentada en el script se utiliza el caracter #

Es también una buena costumbre, por documentación técnica del programa, escribir en líneas comentadas lo que realizada cada segmento del script por ejemplo, un script documentado sería:

#!/bin/bash
#ejemplo.sh

# Script para ejemplo de uso del comando echo
echo "hola mundo"

#otro ejemplo de echo
echo -n "hola"; echo " mundo"

Ejecución consecutiva

Se refiere a con una sola línea de código poder ejecutar más de un comando, lo cual se logra con el signo de punto y coma ;

Ejemplo:

echo -n "hoy es "; date; echo

En este ejemplo tenemos 3 instrucciones en una sola línea de comando. El ; es útil para casos como retrasar la ejecución de una orden (sleep 15;echo "hola mundo") o asegurar que una orden se ejecutará inmediatemente consecutiva a otra anterior.

Operador &&

El operador && nos permite ejecutar un comando de manera condicional, es decir, al unir dos comandos mediante el operador && el segundo se ejecutará sólo si el primero terminó exitosamente. Ejemplo:

ls archivo.txt && wc -l archivo.txt

Donde la instrucción wc -l archivo.txt sé ejecutará solo en caso que la funcion ls no regrese un estado de error..

Operador ||

Similar al anterior, este operador ejecuta un comando sólo en caso que el comando que lo precede presente una salida de error. Un ejemplo de una ejecución sería:

ls archivo.txt || touch archivo.txt

Este ejemplo crearía archivo.txt en caso que no exista, es decir, si el comando ls no se ejecuta de forma satisfactoria se realizará el comando touch.


Estructuras básicas de control

De forma somera podemos decir que el uso de las estructuras básicas de control nos permite indicarle al programa que acción tomar con base en diferentes variables o condiciones que se presenten durante la ejecución del mismo.

Las principales estructuras básicas de control son:

  • if ... then ... else
  • case
  • while
  • for
  • until

 

If ... then ... else

Esta sentencia nos sirve para definir que si se cumple cierta condición ejecute un comando (o serie de comandos) y si no se cumple la condición que ejecute otro conjunto de comandos (o nada). La sintaxis más básica de esta instrucción es de la siguiente manera

if condición ; then comandos ; fi

o en diferentes líneas:

if condición
then
comandos
fi

Cuando sea una sola condición y un sólo comando es recomendable utilizar la primera sintaxis y para instrucciones de más de un comando se entiende mejor en la opción de diferentes líneas.

Otras sintaxis para la sentencia if con más opciones son:

if condición
then
comandos1
else
comandos2
fi

Con esta sintaxis, lo que logramos es revisar una condición y en caso que se cumpla ejecutará la serie de comandos1 y si no se cumple ejecutará la serie de comandos2. Si requerimos más opciones podemos utilizar:

if condición1
then
comandos1
elif condición2
then
comandos2
...
fi

En esta forma de sintaxis,como podrás ver cambia la palabra else por elif (abreviación de else if), lo cual nos permite evaluar una segunda condición si no se cumple la primera y así sucesivamente podemos evaluara tantas condiciones como queramos.

Case

Esta instrucción nos permite evaluar una variable entre sus posibles valores para ejectura comandos de acuerdo al valor de la variable. La sintaxis es de la siguiente forma:

case variable in
patron1)
comandos1;;
patron2|patron3)
comandos2;;
...
esac

Podemos utilizar también el caracter | como cláusula ó, es decir que si la variable tiene un valor o el otro realice la acción.

While

Nos permitirá crear un ciclo para la ejecución de sentencias de manera continua hasta el cumplimiento de una condición o hasta que se le indique salir del ciclo. En este tipo de sentencias tenemos que tener cuidado de no crear ciclos que no tengan salida ya que nuestra ejecución nunca terminaría de manera normal, por lo que tendríamos que acabar el proceso con una instrucción kill

La sintaxis para el ciclo while es:

while [condición]
do
comandos
done

For

El ciclo for en Unix (y Linux) es un poco diferente al normal de los ciclos for.En este caso, la estra estructura de control permite repetir un número de instrucciones para un número de seleccionado de palabras o archivos. Al igual que el anterior se requiere tener cuidado de no caer en ciclos infinitos.

La sintaxis del ciclo for es:

for palabra [in lista_de_palabras...]
do
comandos

done

Por ejemplo:

for archivo in *.c ; do wc -l $archivo ; done

En este ejmplo, se cuentan las líneas de todos los arhivos que terminan con .c y un ejemplo de la salida sería:

15 g_sol.c
59 m_sol00.c
424 m_sol01.c
377 m_sol02.c
287 m_sol03.c

También puedes utilizar la instrucción repeat (sólo en csh) que ejecuta un solo comando en repetidas ocasiones de acuerdo al parámetro conteo.

repeat conteo comando

Ejemplo:

@ veces = 500
repeat $veces echo "Debo poner atención en clase."

Cuya salida será la repetición de la frase "Debo poner atención en clase." 500 veces en la pantalla.


Operador test

Para utilizar las estructuras de control es útil saber utilizar el operador test, esta sección te podrá servir de referencia mientras realizas tus scripts ya que si bien es dificil aprenderse todas las opciones y parámetros de los comandos, es muy funcional tenerlas siempre a la mano.

La instrucción test nos permite obtener resultados Verdadero o Falso relacionado con el sistema de archivos. Algunas de las opciones y sus resultados son los siguientes

 

Sintaxis test Resultado
-a archivo Verdadero si existe el archivo
-d archivo Verdadero si existe el archivo y es un directorio
-f archivo Verdadero si existe el archivo y es un archivo ordinario
-h archivo Verdadero si existe el archivo y es una liga simbólica
-r archivo Verdadero si existe el archivo y es legible por el proceso
-s archivo Verdadero si exsite el archivo y es su tamaño es mayor a cero
-w archivo Verdadero si existe el archivo y es editable por el proceso
-x archivo Verdadero si existe el archivo y es ejecutable por el proceso. Si fuera un directorio es verdadero si tiene premisos
-L archivo Verdadero si existe el archivo y es una liga simbólica
-O archivo Verdadero si existe el archivo y el dueño es el usuario que corre el proceso
-G archivo Verdadero si existe el archivo y el grupo coincide con el del usuario que corre el proceso
archivo1 -nt archivo2 Verdadero si existe el archivo1 y es más nuevo que el archivo2
archivo1 -ot archivo2

Verdadero si existe el archivo1 y es más antiguo que el archivo2

Un ejemplo del uso de la sintaxis del comando test en una sentencia if:

if test -d /export/home/

then
cd /export/home/

fi

En el ejemplo, si existe la carpeta /export/home/ se cambiará a esa ruta.

La combinación del comando test con la estructuras de control te ayudarán a tener una programación mucho más funcional. En este tutorial se muestran solo algunas de las opciones del comando, pero si requieres más información puedes consultar el manual incluído en la documentación de Unix con el comando man test