GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Beginner Series #7:Toma de decisiones con sentencias If Else y Case

¡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:

Afortunadamente, no necesita memorizar ninguna de las condiciones de prueba porque puede buscarlas en la página del manual de prueba:

[email protected]:~$ man test

Vamos a crear un script final llamado filetype.sh que detecta si un archivo es un archivo normal, un directorio o un enlace suave:

#!/bin/bash

if [ $# -ne 1 ]; then
	echo "Error: Invalid number of arguments"
 	exit 1
fi

file=$1

if [ -f $file ]; then
	echo "$file is a regular file."
elif [ -L $file ]; then
	echo "$file is a soft link."
elif [ -d $file ]; then
	echo "$file is a directory."
else
	echo "$file does not exist"
fi

Mejoré un poco la secuencia de comandos al agregar una verificación en la cantidad de argumentos. Si no hay argumentos o más de un argumento, la secuencia de comandos generará un mensaje y saldrá sin ejecutar el resto de las declaraciones en la secuencia de comandos.

Hagamos algunas ejecuciones del script para probarlo con varios tipos de archivos:

[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh 
Error: Invalid number of arguments

Bonificación:declaración Bash if else en una línea

Hasta ahora, todas las declaraciones if else que vio se usaron en un script bash adecuado. Esa es la forma decente de hacerlo, pero no estás obligado a hacerlo.

Cuando solo desea ver el resultado en el shell mismo, puede usar las declaraciones if else en una sola línea en bash.

Supongamos que tiene este script bash.

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

Puede usar todas las declaraciones if else en una sola línea como esta:

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

Puede copiar y pegar lo anterior en la terminal y ver el resultado por sí mismo.

Básicamente, solo agrega punto y coma después de los comandos y luego agrega la siguiente instrucción if-else.

¡Impresionante! Esto debería darle una buena comprensión de las declaraciones condicionales en Bash. ¡Espero que hayas disfrutado haciendo que tus scripts bash sean más inteligentes!

Puede probar sus conocimientos recién adquiridos practicando algunos ejercicios simples de bash en el PDF a continuación. Incluye la solución también.

Bash Chapter 7 Practice QuestionsProblems y su solución para practicar lo que acabas de aprender en este capítuloBash-Chapter-7-Practice-Questions-Linux-Handbook.pdf31 KB

Estén atentos para la próxima semana, ya que aprenderán a usar varias construcciones de bucle en sus scripts de bash.


Linux
  1. Hacer que las computadoras sean más accesibles y sostenibles con Linux

  2. Navegando por el shell Bash con pushd y popd

  3. Bash Beginner Series #9:Uso de funciones en Bash

  4. RHCE Ansible Series #6:Toma de decisiones en Ansible

  5. Uso de declaraciones de casos en Bash

Bash Beginner Series #5:Uso de operadores aritméticos en Bash Scripting

Bash Beginner Series #4:Uso de arreglos en Bash

Bash Beginner Series #3:Pasando Argumentos a Bash Scripts

Bash Beginner Series #6:Operaciones de cadenas en Bash

Bash Beginner Series #10:Automatización con Bash

Comprender Bash If Else y otras declaraciones condicionales

    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