Introducción
La toma de decisiones es uno de los conceptos fundamentales de la programación informática. Al igual que en cualquier otro lenguaje de programación, if
, if..else
, if..elif..else
y if
instrucciones anidadas en Bash se pueden utilizar para ejecutar código basado en una determinada condición.
En este tutorial, lo guiaremos a través de los conceptos básicos de las if
de Bash y le mostraremos cómo usarlas en scripts de shell.
Si declaración
if
condicionales pueden tomar diferentes formas. La if
toma la siguiente forma:
if TEST-COMMAND
then
STATEMENTS
fi
La if
comienza con la if
seguida de la expresión condicional y la palabra clave then
La declaración termina con la palabra clave fi
.
Si TEST-COMMAND
se evalúa como True
STATEMENTS
se ejecuta STATEMENTS. Si TEST-COMMAND
devuelve False
, no sucede nada, STATEMENTS
se ignora.
En general, es una buena idea volver a ingresar el código y separar los bloques de código con líneas en blanco. La mayoría de las personas optan por utilizar una sangría de 4 o 2 espacios. La sangría y las líneas en blanco hacen que su código sea más legible y organizado.
Echemos un vistazo al siguiente script de ejemplo que comprueba si un número determinado es mayor que 10.
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
fi
Guarde el código en un archivo y ejecútelo desde la línea de comando:
bash test.sh
El guión le pedirá que ingrese un número. Por ejemplo, si ingresa 15, el comando de test
true
porque 15 es mayor que 10 y se ejecutará echo
dentro de la then
The variable is greater than 10.
Si otra declaración
La if..else
tiene la siguiente forma:
if TEST-COMMAND
then
STATEMENTS1
else
STATEMENTS2
fi
Si TEST-COMMAND
se evalúa como True
STATEMENTS1
se ejecutará STATEMENTS1. De lo contrario, si TEST-COMMAND
devuelve False
, se ejecutará STATEMENTS2
Es posible tener solo una else
en la declaración.
else
una cláusula else al script de ejemplo anterior:
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
else
echo "The variable is equal or less than 10."
fi
Si ejecuta el código e ingresa un número, el script imprimirá un mensaje diferente dependiendo de si el número es mayor o menor que /igual a 10.
Si elif otra declaración
La if..elif..else
Bash if..elif..else tiene la siguiente forma:
if TEST-COMMAND1
then
STATEMENTS1
elif TEST-COMMAND2
then
STATEMENTS2
else
STATEMENTS3
fi
Si TEST-COMMAND1
se evalúa como True
, se ejecutará STATEMENTS1
Si TEST-COMMAND2
se evalúa como True
, se ejecutará STATEMENTS2
Si ninguno de los comandos de prueba se evalúa como True
, se ejecuta STATEMENTS3
Es posible tener una o más elif
en la declaración. La else
es opcional.
Las condiciones se evalúan secuencialmente. Cuando una condición regresa, True
, las condiciones restantes no se ejecutan y el control del programa pasa al final de las if
.
elif
añadir una cláusula elif a la secuencia de comandos anterior:
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
elif [[ $VAR -eq 10 ]]
then
echo "The variable is equal to 10."
else
echo "The variable is less than 10."
fi
Declaraciones anidadas si
Bash te permite anidar if
if dentro de if
. Puede poner varias if
dentro de otra if
.
La siguiente secuencia de comandos le pedirá que ingrese tres números e imprima el mayor de los tres números.
#!/bin/bash
echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3
if [[ $VAR1 -ge $VAR2 ]]
then
if [[ $VAR1 -ge $VAR3 ]]
then
echo "$VAR1 is the largest number."
else
echo "$VAR3 is the largest number."
fi
else
if [[ $VAR2 -ge $VAR3 ]]
then
echo "$VAR2 is the largest number."
else
echo "$VAR3 is the largest number."
fi
fi
Así es como se verá la salida:
Enter the first number: 4
Enter the second number: 7
Enter the third number: 2
7 is the largest number.
En lugar de utilizar if
, generalmente es más eficiente utilizar la sentencia case.
Varias condiciones
La lógica de los OR
y AND
permite utilizar varias condiciones en if
.
Aquí hay otra versión del script para imprimir el mayor de los tres números. En esta versión, en lugar de tener if
anidadas, usaremos el AND
( &&
).
#!/bin/bash
echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3
if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]]
then
echo "$VAR1 is the largest number."
elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]]
then
echo "$VAR2 is the largest number."
else
echo "$VAR3 is the largest number."
fi
Operadores de prueba
En Bash, el test
utiliza una de las siguientes formas de sintaxis:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
Si desea que su script sea portátil, debería preferir usar el antiguo [
test que está disponible en todos los shells POSIX. La nueva versión actualizada del test
[[
(doble paréntesis) es compatible con la mayoría de los sistemas modernos que utilizan Bash, Zsh y Ksh como shell predeterminado.
Para negar la expresión de prueba, utilice el NOT
( !
). Cuando compare cadenas, utilice siempre comillas simples o dobles para evitar la división de palabras o problemas de globulación.
Estos son algunos de los operadores más utilizados:
-n VAR
: verdadero si la longitud de VAR es mayor que cero.-z VAR
: verdadero si el VAR está vacío.STRING1 = STRING2
- Verdadero [STRING1 y STRING2 son iguales.STRING1!= STRING2
- Verdadero STRING1 y STRING2 no son iguales.INTEGER1 -eq INTEGER2
- True INTEGER1 e INTEGER2 son lo mismo.INTEGER1 -gt INTEGER2
: verdadero INTEGER1 es mayor que INTEGER2.INTEGER1 -lt INTEGER2
: verdadero INTEGER1 es menor que INTEGER2.INTEGER1 -ge INTEGER2
: verdadero INTEGER1 es igual o mayor que INTEGER2.INTEGER1 -le INTEGER2
: verdadero INTEGER1 es igual o menor que INTEGER2.-h`
ARCHIVO`: verdadero si el ARCHIVO existe y es un enlace simbólico.-r`
ARCHIVO`: verdadero si el ARCHIVO existe y es legible.-w`
FILE`: verdadero si el ARCHIVO existe y se puede escribir.-x`
FILE`: verdadero si el FILE existe y es ejecutable.-d`
ARCHIVO`: verdadero si el ARCHIVO existe y es un directorio.-e`
ARCHIVO`: verdadero si el ARCHIVO existe y es un archivo, independientemente del tipo (nodo, directorio, conector, etc.).-f`
ARCHIVO` - Verdadero si el ARCHIVO existe y es un archivo normal (no un directorio o dispositivo).
Conclusión
El if
, if..else
y if..elif..else
le permiten controlar el flujo de ejecución del golpe mediante la evaluación de ciertas condiciones.