Saltar la navegación

Estructuras de control

Condicionales

Las estructuras de control condicionales toman como base el cumplimiento de una o más comparaciones para que puedan ejecutarse los comandos que aparecen enseguida.

La estructura condicional simple se basa en la instrucción if, que sigue esta sintaxis:

     if condicion; then
         uno-o-mas comandos a ejecutar
     fi

Ejemplo:

   if grep -q molina /etc/password; then
       echo "Este usuario debe darse de baja del sistema"
       echo "Porque ha dejado de trabajar para la institucion"
   fi

En este ejemplo, grep devolverá 0, si el usuario molina existe en el archivo /etc/passwd. De modo que la condición está cumpliendose.

Habrá ocasiones en las se requiera comandos diferentes cuando no se cumpla condición especificada.

Ejemplo

if grep -q molina /etc/password; then
       echo "Este usuario debe darse de baja del sistema"
       echo "Porque ha dejado de trabajar para la institucion"

else
      echo "Verifica que este usuario tenga los privilegios necesarios"
      echo "para realizar las tareas que corresponde al rol asignado.2"
fi

Ahora bien, si el usuario molina, no existe en el archivo /etc/passwd, grep devolverá 1, de modo que se ejecutarán los comandos debajo de else.

Antes de crear un script, puede validarse el resultado de grep, accediendo a la variable $?, después de ejecutar el comando grep en cada caso. O sea.

$ grep -q molina /etc/password  #La opción -q, sirve para que se ejecute en silencio, es decir, no muestre el resultado.

$ echo $?     #Esta variable, guarda un 0, si el comando se ejecutó con éxito o un 1, si no produjo un resultado.

test resulta muy fácil de usar, si se quieren realizar comparaciones de archivos o directorios. Algunos usos de test son:

test -f nombre_de_archivo;   #Test devuelve 0 si el archivo especificado existe

test ! -f nombre_de_archivo; #Test devuelve 0 si el archivo especificado no existe

test  -d nombre_de_directorio; #Test devuelve 0 si el directorio especificado existe

test  ! -d nombre_de_directorio; #Test devuelve 0 si el directorio especificado no existe

Podemos hacer una prueba directamente con test, y checando el valor de $?. Veamos algunos ejemplos:

test -f /etc/hosts; echo $?

test -d $HOME; echo $?

 

Ciclos

Los comandos de ciclo se utilizan cuando es necesario ejecutar una o más acciónes de manera repetida. En script se pueden usar los comandos for y while para realizar tareas repetivas.

El ciclo for, se utiliza comúnmente cuando se tiene precisa la colección o lista de valores en base a los que se ejecutarán una o más acciones. Por ejemplo: Supongamos que se requiere hacer el respaldo de un archivo importante, en más de un servidor que se tiene en una lista llamada servidores

1. Crearemos una lista ficticia de servidores que realmente apuntarán nuestro equipo. Con nano, creamos el archivo servidores.txt, con las siguientes entradas en cada línea.

    $ nano servidores.txt

       127.0.0.1
       127.0.0.2
       127.0.0.3
       127.0.0.4
       127.0.0.5

Guardamos el archivo con Ctrl X, y regresamos al shell.

Ahora creamos el script llamado respaldo_remoto.sh, que incluirá los siguientes comandos.

      #!/bin/bash
      SERVIDORES=`cat servidores.txt` #Se lee el contenido del archivo, y se asigna a la variable servidores
      for SERVIDOR in $SERVIDORES;  #Mediante for, se tomará un valor de la lista contenida en $SERVIDORES, y se ejecutará un respaldo en cada servidor.

      do
          Respaldo="`echo $SERVIDOR|cut -d. -f4`" #Extraemos el último digito de cada Servidor, y se asigna a Respaldo
          Ar_destino="hosts"$Respaldo
          scp /etc/hosts $SERVIDOR:/tmp/$Ar_destino
     done
     echo "Respaldo completo"