miércoles, 10 de marzo de 2021

scripts en Bash... para torpes (VII)

Acabamos de hablar, comentando el complejo tema de las ‘ordenes’, de las ordenes cíclicas (for… while… until…). Pueden ser más interesantes (o más ‘usables’ por un usuario ‘torpe’) las órdenes que vamos a ver ahora, también simples de explicar pero complejas de implementar a poco que compliques lo que quieres hacer. .. cuando no has estudiado programación y te faltan recursos de ‘lenguaje’. Me refiero a…
7- Las órdenes condicionales


El condicional if, then, else
Sirve para expresar que cuando ( IF) se cumpla la condiciónA…, entonces (THEN) hay que ejecutar el mandatoX…. Y la orden, que inicia un « if », debe terminar con un « fi ». Además, esta orden se puede ampliar indicando, con ELSE ('en caso contrario')... hay que hacer el mandatoY.
Su sintaxis completa sería esta:
if [ condiciónA ]; then ‘mandatoX’; fi 
o bien
if [ condiciónA ]; then ‘mandato X’; else ‘mandato Y’; fi

Un ejemplo sencillo: llama a este script como quieras, y ejecútalo en una consola, con la orden 'sh nombre_script':
#!/bin/bash
echo "¿me dices cuanto vale esta camisa?: "
read "prix"
if [ $prix -gt 45 ]; then echo "me parece un poco cara, gracias"
else echo "bien, pues me me la llevo"
fi
echo


La instrucción elif
Una forma muy interesante de usar el condicional if, them, else… es hacerlo con la instrucción ‘elif’. Junto con if-them se entiende así: si se cumple la condicionA entonces haz X. En caso contrario (ELIF), si se cumple la condiciónB entonces haz Y.… y esto se puede repetir cuantas veces quieras (en caso contrario (nuevo ELIF) si se cumple la condiciónC entonces haz Z, etc, etc).
Su sintaxis-tipo sería (para 4 'distintas condiciones' (3 + 'else') y 4 distintos mandatos')...
if [ condiciónA ]; then ‘mandato X’
elif [ condiciónB ]; then ‘mandato Y’
elif [ condiciónC ]; then ‘mandato Z’
else ‘mandato W’
fi

Por ejemplo, este tonto script que, como antes, pégalo en el editor de textos, ponle un nombre y ejecútalo en consola, con 'sh...'
#!/bin/bash
echo "Adivina en qué año nació Claudia Schiffer: "
read year
GAP=$(($year - 1970))
if [ $GAP -eq 0 ]; then echo "¡Correcto: Y si, ya pasó de los 50!"
elif [ $GAP -ge -3 -a $GAP -le 3 ]; then echo "bueno, estuviste cerca. ¿Quieres intentarlo otra vez?"
else echo "Estás muy despistado. Déjalo… o prueba de nuevo... afinando más"
fi


La sentencia case
Otra forma (vale, algo retorcida...) de usar el ‘if them’ sería ‘anidando’ las condiciones. Algo como ésto (lo pongo así, separando con ‘punto y coma’, para no ocupar mucho)
if [[ $a -gt $b ]]; then if [[ $b -gt $c ]]; then if [[ $c -gt $d ]]; then if [[ $d -gt $e ]]; then
echo "$a es mucho mayor que $e"
fi; fi; fi; fi

Dicho esto, «case» es otra función ‘condicional’, parecida a if, pero con un enfoque que puede ser más útil porque simplifica bastante la instrucción a crear, y además puede estar contenida dentro de otras estructuras con if… o con While...

Su concepto es el de crear ‘patrones’ del tipo ‘en el caso de que se de el patrón X, ejecuta A’, y se puede añadir los que se quiera, separados por un doble punto y coma ( ‘y en el caso de que se de Y, haz B’, y en el caso de que se de Z, haz C,...)

Su sintaxis, si llamamos ‘expresión’ a lo que introduzcamos, generalmente el valor de una variable, es así:
“case expresion in... “patrónX” (y se añade un cierre de paréntesis)… mandatoA ;;
Es decir, con un paréntesis de cierre « ) » después de cada caso (condición) y doble punto y coma, « ;; » para delimitar la lista de comandos que serán ejecutados cuando se cumpla el caso (condición).
Y, finalmente, así como la sentencia if hay que terminarla con un ‘fi’, ‘case’ termina su sentencia con un ‘esac’.
NOTA: hay que fijarse bien en poner correctamente el paréntesis, los dobles punto y coma, etc. Fíjate en el siguiente ejemplo (y fíjate también que ‘los otros casos’ se indican con el patrón *)
#!/bin/bash
echo “dime un color primario ” && read color
case $color in
rojo)
echo "si, el rojo es color primario en la luz"
;;
verde)
echo "si, el verde es color primario en la luz"
;;
azul)
echo "si, el azul es color primario en la luz"
;;
blanco)
echo "NO, el blanco es color aditivo Rojo + Azul + Verde en RGB (en al luz)"
;;
amarillo)
echo "NO, el amarillo es color aditivo Rojo + Verde. Pero SI es primario en mezcla de pigmentos"
;;
negro)
echo "NO, es color aditivo en mezcla de pigmentos (CMYK) Cian + Magenta + Amarillo"
;;
magenta)
echo "NO, es color aditivo en RGB Azul + Rojo. Pero SI es primario en mezcla de pigmentos" CMKY
;;
*)
echo "NO es primario. Pero desconozco como obtenerlo por adición"
;;
esac

Pues hala, dichas estas ideas... a practicar (o a buscar nuevos ejemplos, o aplicaciones, por Google, que hay mucha info...). Por cierto, hace algo menos de un año, hablando de otra forma de crear 'cajas de diálogo', puse como ejemplo un bonito ejercicio, con la sentencia 'case'


Ir al Sumario (del tema)

No hay comentarios:

Publicar un comentario