¡Hagamos que nuestros bash scripts sean inteligentes!
En esta parte de la serie para principiantes de bash, aprenderá cómo usar declaraciones condicionales en sus scripts de bash para que se comporte de manera diferente en diferentes escenarios y casos.
De esta manera, puede crear scripts bash mucho más eficientes y también puede implementar la comprobación de errores en sus scripts.
Uso de la declaración if en bash
La construcción más fundamental en cualquier estructura de toma de decisiones es una condición condicional. La sintaxis general de una instrucción if básica es la siguiente:
if [ condition ]; then
your code
fi
El if
declaración se cierra con un fi
(inverso de si).
¡Presta atención a los espacios en blanco!
- Debe haber un espacio entre los corchetes de apertura y cierre y la condición que escriba. De lo contrario, el shell se quejará de error.
- Debe haber espacio antes y después del operador condicional (=, ==, <=, etc.). De lo contrario, verá un error como "se esperaba un operador unario".
Ahora, creemos un script de ejemplo root.sh. Este script hará eco de la declaración "usted es root" solo si ejecuta el script como usuario root:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
fi
El whoami
El comando genera el nombre de usuario. Del tutorial de variables de bash, sabes que $(command)
la sintaxis se utiliza para la sustitución de comandos y le proporciona la salida del comando.
La condición $(whoami) = 'root'
será verdadero solo si ha iniciado sesión como usuario root.
¿No me crees? No tienes que hacerlo. Ejecútelo y compruébelo usted mismo.
Uso de la declaración if-else en bash
Es posible que haya notado que no obtiene ningún resultado cuando ejecuta root.sh script como un usuario regular. Cualquier código que desee ejecutar cuando una condición if se evalúe como falsa se puede incluir en una declaración else de la siguiente manera:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Ahora, cuando ejecute el script como un usuario normal, se le recordará que no es el todopoderoso usuario root:
[email protected]:~$ ./root.sh
You are not root
Uso de la declaración else if en bash
Puede usar una declaración elif (else-if) siempre que desee probar más de una expresión (condición) al mismo tiempo.
Por ejemplo, el siguiente age.sh bash script toma su edad como argumento y generará un mensaje significativo que corresponde a su edad:
#!/bin/bash
AGE=$1
if [ $AGE -lt 13 ]; then
echo "You are a kid."
elif [ $AGE -lt 20 ]; then
echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
echo "You are an adult."
else
echo "You are an elder."
fi
Ahora haz algunas ejecuciones de age.sh guión para probar con diferentes edades:
[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.
Note que he usado el -lt
(menor que) condición de prueba con la variable $AGE.
También tenga en cuenta que puede tener múltiples elif
sentencias pero solo una else
instrucción en una construcción if y debe cerrarse con un fi
.
Uso de declaraciones if anidadas en bash
También puede usar una declaración if dentro de otra declaración if. Por ejemplo, eche un vistazo al siguiente weather.sh secuencia de comandos bash:
#!/bin/bash
TEMP=$1
if [ $TEMP -gt 5 ]; then
if [ $TEMP -lt 15 ]; then
echo "The weather is cold."
elif [ $TEMP -lt 25 ]; then
echo "The weather is nice."
else
echo "The weather is hot."
fi
else
echo "It's freezing outside ..."
fi
El script toma cualquier temperatura como argumento y luego muestra un mensaje que refleja cómo sería el clima. Si la temperatura es superior a cinco, entonces se evalúa la instrucción if-elif anidada (interna). Hagamos algunas ejecuciones del script para ver cómo funciona:
[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.
Using Case declaración en bash
También puede usar declaraciones de casos en bash para reemplazar varias declaraciones if, ya que a veces son confusas y difíciles de leer. La sintaxis general de una construcción de caso es la siguiente:
case "variable" in
"pattern1" )
Command … ;;
"pattern2" )
Command … ;;
"pattern2" )
Command … ;;
esac
¡Presta atención!
- Los patrones siempre van seguidos de un espacio en blanco y
)
. - Los comandos siempre van seguidos de doble punto y coma
;;
. El espacio en blanco no es obligatorio antes. - Las declaraciones de casos terminan con
esac
(reverso del caso).
Las declaraciones de casos son particularmente útiles cuando se trata de coincidencias de patrones o expresiones regulares. Para demostrarlo, eche un vistazo al siguiente char.sh secuencia de comandos bash:
#!/bin/bash
CHAR=$1
case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac
El script toma un carácter como argumento y muestra si el carácter es un alfabeto pequeño/grande, un número o un carácter especial.
[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.
Tenga en cuenta que he usado el símbolo de asterisco comodín (*) para definir el caso predeterminado, que es el equivalente de una declaración else en una condición if.
Condiciones de prueba en bash
Existen numerosas condiciones de prueba que puede usar con declaraciones if. Las condiciones de prueba varían si está trabajando con números, cadenas o archivos. Piense en ellos como operadores lógicos en bash.
He incluido algunas de las condiciones de prueba más populares en la siguiente tabla:
Condición | Equivalente |
---|---|
$a -lt $b | $a <$b |
$a -gt $b | $a> $b |
$a -le $b | $a <=$b |
$a -ge $b | $a>=$b |
$a -eq $b | $a es igual a $b |
$a-ne $b | $a no es igual a $b |
-e $ARCHIVO | $FILE existe |
-d $ARCHIVO | $FILE existe y es un directorio. |
-f $ARCHIVO | $FILE existe y es un archivo normal. |
-L $ARCHIVO | $FILE existe y es un enlace suave. |
$CADENA1 =$CADENA2 | $STRING1 es igual a $STRING2 |
$CADENA1 !=$CADENA2 | $STRING1 no es igual a $STRING2 |
-z $CADENA1 | $STRING1 está vacío |