Condicionales en shell scripts: cómo utilizarlos

En esta oportunidad trataremos el tema del uso de condicionales en shell scripts antes de tomar una determinada acción o para decidir un curso a seguir de acuerdo a un resultado. Si todavía no lo hicieron, les recomiendo que vean los dos posts anteriores (introducción al tema y ejemplos) antes de proseguir con la lectura del actual.

Uso de condicionales en shell scripts

La forma más elemental de control de flujo en cualquier lenguaje de programación es el uso de una estructura if / else. En shell scripting se implementa de la siguiente manera:

[pastacode lang=»bash» manual=»if%20%5B%20CONDICI%C3%93N%20%5D%3B%20then%0A%20%20%20%20%5B%20ACCI%C3%93N%20%5D%0Aelse%0A%20%20%20%20%5B%20ACCI%C3%93N%20ALTERNATIVA%20%5D%0Afi» message=»» highlight=»» provider=»manual»/]

(la indentación del código, aunque no es estrictamente requerida, ayuda a la lectura del script).

Entre las posibles condiciones que podríamos querer chequear están las siguientes

  • Existencia de un archivo o directorio
  • Finalización correcta del último comando ejecutado
  • Verificación de archivos vacíos
  • etc.

Una lista más completa de condiciones puede encontrarse en este apartado del sitio web de The Linux Documentation Project.

Para ejemplificar, tomaremos el script que creamos en el post anterior (backupbasico.sh) y lo modificaremos para lograr lo siguiente:

  • Antes de ejecutarse, chequear que el directorio a comprimir exista. Si no existe, finalizar con código de error 10 (una elección de código de error arbitraria).
  • Si la compresión resulta exitosa, mostrar un mensaje por pantalla que así lo indique. De otra manera, mostrar un mensaje descriptivo y finalizar con código de error 20 (otra elección arbitraria).
  • Verificar que el tarball no esté vacío (es decir, que su tamaño sea distinto de 0 B). Mostrar mensajes de confirmación o de error según corresponda (finalizar con error 30 en este último escenario).

El script resultante:

[pastacode lang=»bash» manual=»%23!%2Fbin%2Fbash%0A%0A%23%20El%20directorio%20a%20comprimir%20es%20el%20primer%20par%C3%A1metro%0ADIRECTORIO%3D%241%0A%0A%23%20Nombre%20del%20tarball%0AARCHIVO%3D%242%0A%0A%23%20Chequear%20existencia%20de%20directorio%0Aif%20%5B%20-d%20%24DIRECTORIO%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%23%20Comprimir%20los%20contenidos%20de%20%24DIRECTORIO%0A%20%20%20%20%20%20%20%20tar%20czf%20%24ARCHIVO%20%24DIRECTORIO%2F*%0A%20%20%20%20%20%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%5B%20-s%20%24ARCHIVO%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Mostrar%20mensaje%20por%20pantalla%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%22Se%20ha%20terminado%20de%20respaldar%20%24DIRECTORIO%20en%20%24ARCHIVO.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Indicar%20error%20por%20archivo%20vac%C3%ADo%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%22El%20archivo%20resultante%20(%24ARCHIVO)%20est%C3%A1%20vac%C3%ADo.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fi%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Indicar%20error%20y%20finalizar%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%22La%20compresi%C3%B3n%20de%20%24DIRECTORIO%20en%20%24ARCHIVO%20no%20finaliz%C3%B3%20correctamente.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20exit%2030%0A%20%20%20%20%20%20%20%20fi%0Aelse%0A%20%20%20%20%20%20%20%20%23%20Indicar%20si%20el%20directorio%20no%20existe%20y%20finalizar%20con%20c%C3%B3digo%20de%20error%0A%20%20%20%20%20%20%20%20echo%20%22El%20directorio%20%24DIRECTORIO%20no%20existe.%22%0A%20%20%20%20%20%20%20%20exit%2010%0Afi» message=»» highlight=»» provider=»manual»/]

Expliquemos ahora el propósito de los argumentos de cada if:

  • La opción -d seguida de la ruta a un directorio se utiliza para chequear que el mismo exista.
  • Como ya explicamos en el post anterior, $? nos indica el código de finalización del comando inmediatamente anterior. La opción -eq 0 chequea si el código de finalización sea igual a 0.
  • La opción -s seguida de la ruta a un archivo verifica que el mismo exista y que su tamaño sea distinto a 0 B.

Veamos en la Fig. 1 qué pasa y (el código de error asociado) cuando le pasamos al script:

  • Un directorio inexistente
  • Un directorio vacío
Corriendo el script con argumentos que resultan en errores de salida
Figura 1 – Corriendo el script con argumentos que resultan en errores de salida

Luego de haber explicado el uso de condicionales en shell scripts con el ejemplo anterior, podremos tocar el tema de bucles en el próximo post a fin de reiterar una determinada acción un número dado de veces de acuerdo a nuestras necesidades. ¡Nos leemos en breve!