|
| 1 | +# Condicionales de Bash |
| 2 | + |
| 3 | +En la última sección, hemos cubierto algunas de las expresiones condicionales más populares. Ahora podemos usarlas con sentencias condicionales estándar como `if`, `if-else` y `switch case`. |
| 4 | + |
| 5 | +## Sentencia If |
| 6 | + |
| 7 | +El formato de una sentencia `if` en Bash es el siguiente: |
| 8 | + |
| 9 | +```bash |
| 10 | +if [[ condicion ]] |
| 11 | +then |
| 12 | + <comandos> |
| 13 | +fi |
| 14 | +``` |
| 15 | + |
| 16 | +Aquí hay un ejemplo rápido que le pedirá que introduzca su nombre en caso de que lo haya dejado vacío: |
| 17 | + |
| 18 | +```bash |
| 19 | +#!/bin/bash |
| 20 | + |
| 21 | +# Ejemplo de sentencia if en Bash |
| 22 | + |
| 23 | +read -p "¿Cuál es su nombre? " nombre |
| 24 | + |
| 25 | +if [[ -z ${nombre} ]] |
| 26 | +then |
| 27 | + echo "¡Por favor, escriba su nombre!" |
| 28 | +fi |
| 29 | +``` |
| 30 | + |
| 31 | +## Sentencia If Else |
| 32 | + |
| 33 | +Con una sentencia `if-else`, puede especificar una acción en caso de que la condición de la sentencia `if` no se cumpla. Podemos combinar esto con las expresiones condicionales de la sección anterior de la siguiente manera: |
| 34 | + |
| 35 | +```bash |
| 36 | +#!/bin/bash |
| 37 | + |
| 38 | +# Ejemplo de sentencia if en Bash |
| 39 | + |
| 40 | +read -p "¿Cuál es su nombre? " nombre |
| 41 | + |
| 42 | +if [[ -z ${nombre} ]] |
| 43 | +then |
| 44 | + echo "¡Por favor, introduzca su nombre!" |
| 45 | +else |
| 46 | + echo "Hola ${nombre}" |
| 47 | +fi |
| 48 | +``` |
| 49 | + |
| 50 | +Puede utilizar la sentencia if anterior con todas las expresiones condicionales de los capítulos anteriores: |
| 51 | + |
| 52 | +```bash |
| 53 | +#!/bin/bash |
| 54 | + |
| 55 | +admin="devdojo" |
| 56 | + |
| 57 | +read -p "Introduzca su nombre de usuario " usuario |
| 58 | + |
| 59 | +# Comprueba si el nombre de usuario proporcionado es el del administrador |
| 60 | + |
| 61 | +if [[ "${usuario}" == "${admin}" ]] ; then |
| 62 | + echo "¡Usted es el usuario administrador!" |
| 63 | +else |
| 64 | + echo "¡Usted NO es el usuario administrador!" |
| 65 | +fi |
| 66 | +``` |
| 67 | + |
| 68 | +Aquí hay otro ejemplo de una sentencia `if` que comprobaría su actual `ID de usuario` y no le permitiría ejecutar el script como el usuario `root`: |
| 69 | + |
| 70 | +```bash |
| 71 | +#!/bin/bash |
| 72 | + |
| 73 | +if (( $EUID == 0 )); then |
| 74 | + echo "Por favor, no ejecutar como usuario root" |
| 75 | + exit |
| 76 | +fi |
| 77 | +``` |
| 78 | + |
| 79 | +Si pone esto encima de su script saldría en caso de que el EUID sea 0 y no ejecutaría el resto del script. Esto fue discutido en [el foro de la comunidad de DigitalOcean](https://www.digitalocean.com/community/questions/how-to-check-if-running-as-root-in-a-bash-script). |
| 80 | + |
| 81 | +También puede probar múltiples condiciones con una sentencia `if`. En este ejemplo queremos asegurarnos de que el usuario no es ni el usuario administrador ni el usuario root para asegurarnos de que el script es incapaz de causar demasiado daño. Usaremos el operador `or` en este ejemplo, señalado por `||`. Esto significa que cualquiera de las condiciones debe ser verdadera. Si usáramos el operador `and` de `&&` entonces ambas condiciones tendrían que ser verdaderas. |
| 82 | + |
| 83 | +```bash |
| 84 | +#!/bin/bash |
| 85 | + |
| 86 | +admin="devdojo" |
| 87 | + |
| 88 | +read -p "Introduzca su nombre de usuario " usuario |
| 89 | + |
| 90 | +# Comprueba si el nombre de usuario proporcionado es el del administrador |
| 91 | + |
| 92 | +if [[ "${usuario}" != "${admin}" ]] || [[ $EUID != 0 ]] ; then |
| 93 | + echo "Usted no es el usuario admin o root ¡pero por favor tenga cuidado!" |
| 94 | +else |
| 95 | + echo "¡Usted es el usuario administrador! ¡Esto podría ser muy destructivo!" |
| 96 | +fi |
| 97 | +``` |
| 98 | + |
| 99 | +Si tiene múltiples condiciones y escenarios, entonces puede usar la sentencia `elif` con las sentencias `if` y `else`. |
| 100 | + |
| 101 | +```bash |
| 102 | +#!/bin/bash |
| 103 | + |
| 104 | +read -p "Introduzca un número: " num |
| 105 | + |
| 106 | +if [[ $num -gt 0 ]] ; then |
| 107 | + echo "El número es positivo" |
| 108 | +elif [[ $num -lt 0 ]] ; then |
| 109 | + echo "El número es negativo" |
| 110 | +else |
| 111 | + echo "El número es 0" |
| 112 | +fi |
| 113 | +``` |
| 114 | + |
| 115 | +## Sentencias switch case |
| 116 | + |
| 117 | +Al igual que en otros lenguajes de programación, puede utilizar una sentencia `case` para simplificar las condiciones complejas cuando hay varias opciones diferentes. Así, en lugar de usar varias sentencias `if`, e `if-else`, puede usar una sola sentencia `case`. |
| 118 | + |
| 119 | +La sintaxis de la sentencia `case` de Bash tiene el siguiente aspecto: |
| 120 | + |
| 121 | +```bash |
| 122 | +case $alguna_variable in |
| 123 | + |
| 124 | + patrón_1) |
| 125 | + comandos |
| 126 | + ;; |
| 127 | + |
| 128 | + patrón_2| patrón_3) |
| 129 | + comandos |
| 130 | + ;; |
| 131 | + |
| 132 | + *) |
| 133 | + comandos por defecto |
| 134 | + ;; |
| 135 | +esac |
| 136 | +``` |
| 137 | + |
| 138 | +Un rápido resumen de la estructura: |
| 139 | + |
| 140 | +* Todas las sentencias `case` comienzan con la palabra clave `case`. |
| 141 | +* Al igual que la palabra clave `case`, necesita especificar una variable o una expresión seguida de la palabra clave `in`. |
| 142 | +* Después de eso, tiene sus patrones `case`, donde necesita usar `)` para identificar el final del patrón. |
| 143 | +* Puede especificar múltiples patrones divididos por una tubería: `|`. |
| 144 | +* Después del patrón, usted especifica los comandos que le gustaría que se ejecutaran en caso de que el patrón coincida con la variable o la expresión que ha especificado. |
| 145 | +* Todas las cláusulas deben terminar añadiendo `;;` al final. |
| 146 | +* Puede tener una sentencia por defecto añadiendo un `*` como patrón. |
| 147 | +* Para cerrar la sentencia `case`, utilice la palabra clave `esac` (case escrito al revés). |
| 148 | + |
| 149 | +Este es un ejemplo de una sentencia `case` de Bash: |
| 150 | + |
| 151 | +```bash |
| 152 | +#!/bin/bash |
| 153 | + |
| 154 | +read -p "Introduzca el nombre de su marca de automóvil: " automovil |
| 155 | + |
| 156 | +case $automovil in |
| 157 | + |
| 158 | + Tesla) |
| 159 | + echo -n "La fábrica de automóviles de ${automovil} está en EE.UU.". |
| 160 | + ;; |
| 161 | + |
| 162 | + BMW | Mercedes | Audi | Porsche) |
| 163 | + echo -n "La fábrica de automóviles de ${automovil} está en Alemania". |
| 164 | + ;; |
| 165 | + |
| 166 | + Toyota | Mazda | Mitsubishi | Subaru) |
| 167 | + echo -n "La fábrica de automóviles de ${automovil} está en Japón". |
| 168 | + ;; |
| 169 | + |
| 170 | + *) |
| 171 | + echo -n "${automovil} es una marca de automóviles desconocida." |
| 172 | + ;; |
| 173 | + |
| 174 | +esac |
| 175 | +``` |
| 176 | + |
| 177 | +Con este script, pedimos al usuario que introduzca el nombre de una marca de coche como Telsa, BMW, Mercedes, etc. |
| 178 | + |
| 179 | +A continuación, con una sentencia `case`, comprobamos el nombre de la marca y si coincide con alguno de nuestros patrones, imprimimos la ubicación de la fábrica. |
| 180 | + |
| 181 | +Si el nombre de la marca no coincide con ninguna de nuestras sentencias `case`, mostraremos nuestro mensaje por defecto: `es una marca de automóviles desconocida`. |
| 182 | + |
| 183 | +## Conclusión |
| 184 | + |
| 185 | +Le aconsejo intentar modificar el script y jugar con él un poco ¡así puede practicar lo que ha aprendido en los últimos dos capítulos! |
| 186 | + |
| 187 | +Para más ejemplos de sentencias `case` de Bash, asegúrese de ir al capítulo 16, donde crearemos un menú interactivo en Bash usando sentencias `case` para procesar la entrada del usuario. |
| 188 | + |
0 commit comments