Este es uno de los capítulos del tutorial Scripts en Bash. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Aunque me gusta ser muy verboso a la hora de escribir código, hay días en los que me levanto justo con el pie cambiado, y me gusta poner en una única línea todo un script. Quizás he exagerado un poco en esto último, pero si que es cierto, que en ocasiones me gusta simplificar, y si en lugar de utilizar cuatro líneas de código puedo utilizar una mejor que mejor. Evidentemente, siempre y cuando el resultado de esa línea de código sea mucho mas aclaratorio, o mejor dicho, mucho mas legible. En ocasiones, por simplificar y tirarlo todo en una línea de código, el efecto que se consigue es justo el contrario, que aquello sea casi un jeroglífico. Una de las mejoras que puedes conseguir a la hora de simplificar, son los condicionales en línea en Bash.
Condicionales en línea en Bash
Lo mas sencillo
Empecemos por lo mas sencillo, es decir, agrupando todos los elementos que constituyen tu condicional en la misma línea. Así, por ejemplo, un condicional de lo más básico,
if [[ $valor -eq 5 ]]
then
echo Iguales
fi
Esto mismo lo podrías expresar de la siguiente forma,
if [[ $valor -eq 5 ]]; then echo Iguales; fi
Sin embargo, realizándolo así, tampoco es que ganes mucho, y sinceramente, desde mi personal punto de vista si que pierdes en legibilidad. Mas si cabe, si en la misma línea además añades un else
, tal y como te muestro a continuación. Primero, de la manera clásica,
if [[ $valor -eq 5 ]]
then
echo Iguales
else
echo Distintos
fi
y a continuación en línea,
if [[ $valor -eq 5 ]]; then echo Iguales; else echo Distintos; fi
Mejorando los condicionales en línea
Como ves esta solución no resulta excesivamente legible. Sin embargo, se puede hacer mejor, y entonces si que ganarás en legibilidad. Esto es tan sencillo como utilizar los operadores &&
y ||
. Esto te va a permitir conseguir los mismos resultados que con lo que has visto hasta el momento, pero de una forma mucho mas simplificada. Así, por ejemplo, el primero de los que hemos visto, se puede mostrar de la siguiente forma,
[[ $valor -eq 5 ]] && echo Iguales
Y si ademá queremos utilizar también el else
, quedaría como te muestro a continuación,
[[ $valor -eq 5 ]] && echo Iguales || echo Distintos
Con todo esto no te estoy mostrando nada del otro mundo. Esto seguro que lo has visto en innumerables tutoriales de Ubuntu o de otras distribuciones para instalar alguna aplicación que te dicen algo como,
sudo apt update && sudo apt install <app>
Condicionas la ejecución del segundo de los comandos al resultado del primer comando. Si el resultado del primer comando no es 0
, el segundo de los comandos no se ejecutará. De hecho, lo podrías mejorar de la siguiente forma,
sudo apt update && sudo apt install <app> || echo "No se ha podido actualizar"
Condicionales en línea numéricos
Otra interesante opción a la hora de utilizar condicionales en línea, son los condicionales numéricos. Los condicionales numéricos son muy similares, por node decirte que son idénticos a los que puedes encontrar en otros lenguajes de programación como JavaScript. Por ejemplo,
((resultado=valor>5?10:20))
De esta sencilla forma dependiendo del valor que contenga la variable le asignará 10
o 20
. Si te fijas, realmente, con este tipo de operadores, si que se simplifica enormemente la operativa, y es realmente muy legible.
Si además quisiseras imprimir el valor resultante, podrías combinarlo con la solución anterior, para sacar algo como,
((resultado = valor>5?10:20)) && echo $resultado
o incluso
((resultado = valor>5?10:20)) ; echo $resultado
El vídeo
Esto mismo te lo muestro en un vídeo para que veas lo práctico que resulta el uso de los condicionales en línea en Bash.
Buenos dias estimados , quien de ustedes podrian ayudarme con un .bash . que me compare este archivos sms.log el tamaño.
Por ejemplo :
1. wc -l SMS.LOG | awk ‘{print $1}’
resultado : 7169
2.wc -l SMS.LOG | awk ‘{print $1}’
Resultado: 7180
Que me compare los dos resultados si el primer resultado es menor al segundo resultado : que solo indique que el proceso esta corriedo sin problemas y en caso contrario me indique en el logs , que el proceso esta con problemas.
Muchas gracias, excelente todo este material
Muchas gracias por tu comentario