En esta lección, veremos cómo podemos usar declaraciones If-Then-Else en los scripts del entorno Bash que escribimos. Las declaraciones If-Then-Else son una herramienta útil para proporcionar una forma de definir la ruta de acción de un script cuando se cumplen algunas condiciones. Veamos cuál es la sintaxis de las declaraciones If-Then-Else:
then THEN-COMMANDS
else ELSE-COMMANDS
fi
En el comando anterior que se muestra, si se encuentra que SOME-COMMANDS es verdadero o su estado de retorno es 0, se ejecutarán THEN-COMMANDS. Si este no es el caso, se ejecutan ELSE-COMMANDS. En ALGUNOS COMANDOS, generalmente hacemos alguna comparación de cadenas o comparación de valores en forma de números enteros. También podemos hacer muchas operaciones que involucran archivos. Veamos algunos ejemplos de comandos primarios que se utilizan principalmente cuando se trabaja con condiciones basadas en archivos:
Primario | Significado |
---|---|
[-a <ARCHIVO>] | Devuelve verdadero cuando existe ARCHIVO. |
[-b <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un archivo especial de bloque. |
[-c <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un archivo especial de caracteres. |
[-d <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un directorio. |
[-e <FILE>] | Devuelve verdadero cuando existe ARCHIVO. |
[-f <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un archivo normal. |
[-g <ARCHIVO>] | Devuelve verdadero cuando FILE existe y su bit SGID está establecido. |
[-h <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un enlace simbólico. |
[-k <ARCHIVO>] | Devuelve verdadero cuando FILE existe y su bit adhesivo está establecido. |
[-p <FILE>] | Devuelve verdadero cuando FILE existe y es una tubería con nombre (FIFO). |
[-r <ARCHIVO>] | Devuelve verdadero cuando el ARCHIVO existe y es legible. |
[-s <FILE>] | Devuelve verdadero cuando FILE existe y tiene un tamaño mayor que cero. |
[-t <FD>] | Devuelve verdadero cuando el descriptor de archivo FD está abierto y se refiere a una terminal. |
[-u <ARCHIVO>] | Devuelve verdadero cuando FILE existe y su bit SUID (establecer ID de usuario) está establecido. |
[-w <ARCHIVO>] | Devuelve verdadero cuando FILE existe y se puede escribir. |
[-x <FILE>] | Devuelve verdadero cuando FILE existe y es ejecutable. |
[-O <FILE>] | Devuelve verdadero cuando el ARCHIVO existe y es propiedad del ID de usuario efectivo. |
[-G <ARCHIVO>] | Devuelve verdadero cuando el ARCHIVO existe y es propiedad del ID de grupo efectivo. |
[-L <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un enlace simbólico. |
[-N <ARCHIVO>] | Devuelve verdadero cuando FILE existe y se ha modificado desde que se leyó por última vez. |
[-S <ARCHIVO>] | Devuelve verdadero cuando FILE existe y es un socket. |
THEN-COMMANDS y ELSE-COMMANDS pueden ser cualquier operación UNIX válida o cualquier programa ejecutable. Tenga en cuenta que los comandos then y fi están separados por punto y coma, ya que se consideran elementos completamente separados de un script.
Ejemplo simple If-Then-Else
Comencemos nuestra lección con un ejemplo muy simple con declaraciones If-Then-Else.
Aquí hay un programa de muestra:
Si Ejemplo
Aquí está la salida que vemos cuando ejecutamos nuestro script:
Values are same!
$
Usar argumentos de línea de comandos
También podemos usar argumentos de línea de comandos en nuestros scripts y usar el número de argumentos y los valores en sí como una condición en la declaración IF que definimos. Primero definimos un archivo de texto con el siguiente contenido:
terminalish!
Ahora, podemos escribir un script que encuentre si una palabra aparece en un archivo de texto o no. Definamos el script ahora:
grep $1 $2
if [ $? -ne 0 ]
then
echo “$1 not found in file $2.”
else
echo “$1 found in file $2.”
fi
echo “Script completed.”
Este guión es muy dinámico. Considera la palabra a buscar y el archivo a buscar desde la propia línea de comandos. Ahora, estamos listos para ejecutar nuestro script:
Veremos una salida como:
love found in file hello.txt.
Script completed.
Comprobando el número de argumentos de la línea de comandos
Dentro de una declaración IF, incluso podemos verificar cuántos argumentos de la línea de comandos se pasaron al comando para que podamos actuar sobre lo mismo:
if [ ! $count -gt 1 ]
then
echo “Not enough arguments”
else
echo “Good job!”
fi
Ejecutemos este script ahora, veremos el siguiente resultado:
Argumentos de la línea de comandos
Declaraciones If-Then-Elif-Else
También podemos tener múltiples declaraciones IF en el mismo bloque para reducir la ruta de decisión que toma nuestro programa para ejecutar los comandos que definimos. Aquí está la sintaxis para definir múltiples declaraciones IF en nuestros scripts:
then
RESULT-COMMANDS
elif
ANOTHER-COMMANDS
then
ANOTHER-RESULT-COMMANDS
else
ALTERNATE-COMMANDS
fi
Sin embargo, esto parece bastante familiar y fácil de seguir. Definamos un ejemplo sencillo para establecer cómo funciona el árbol:
if [ $count -eq 1 ]
then
echo “Only one argument found.”
elif [ $count -eq 2 ]
then
echo “Better, two arguments found.”
else
echo “Good job, many arguments found!”
fi
Esto es lo que obtenemos con este comando:
Ejemplo de If Then Elif Else
Usar declaraciones de casos
Las declaraciones IF-ELSE son útiles cuando tiene una gran lista de opciones sobre las que debe decidir. Pero en caso de que desee realizar una acción solo en unos pocos casos de coincidencia exacta con el resultado, también podemos usar declaraciones CASE en scripts Bash. Su sintaxis se parece a:
CASE2) COMMANDS-TO-EXECUTE
CASE2) COMMANDS-TO-EXECUTE
…) COMMANDS-TO-EXECUTE
*) COMMANDS-TO-EXECUTE
esac
El último caso con * actúa como el caso predeterminado y se ejecutará cuando ninguno de los casos definidos anteriormente coincida.
Construyamos rápidamente un ejemplo simple usando las declaraciones CASE:
1)
echo “Value is 1.”
2)
echo “Value is 2.”
3)
echo “Value is 3.”
*)
echo “Other value passed.”
esac
Cada instrucción CASE termina con (doble punto y coma). Esto es lo que obtenemos con este comando:
Ejemplo de CASO
Conclusión
En esta lección, analizamos cómo podemos usar las declaraciones IF-ELSE, IF-THEN-ELIF y CASE en los scripts Bash que definimos para tomar acciones específicas sobre la base de valores que existen en nuestros programas o pasados por el usuario usando posicional parámetros.