1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
Por defecto, una variable, en cualquier script en Bash, con independencia de su contenido, es tratada como una cadena de texto, y no como un número. Esto, como te puedes imaginar, complica esto de las operaciones matemáticas. Así, en primera instancia podrías pensar que es mejor utilizar algún otro lenguaje de programación para estos menesteres. Sin embargo, no es necesario, con el paso de las versiones de Bash, poco a poco, se ha ido mejorando. Sin embargo, una observación importante, Bash solo opera con enteros. Para realizar operaciones matemáticas en Bash con números reales, necesitas utilizar bc. Así básicamente tienes hasta cinco opciones, al menos, para facilitarte el trabajo con las operaciones matemáticas. Se trata de declare, expr, let, dobles paréntesis y bc tal y como te he adelantado en el párrafo anterior. DECLARE La primera de las opciones que tienes para realizar operaciones matemáticas es declare. Así, con declare defines algunas propiedades de la variable. -r define la variable como de solo lectura. Es decir, que tu variable es inmutable, de forma que si intentas cambiar su valor te arrojará un error. -i te permite declarar la variable como un entero. -a lo utilizarás para declarar arrays. -f te permite declarar una función. Además si ejecuta declare -f, así sin argumentos, obtendrás un listado de las funciones declaradas previamente. Una observación importante es que al definir una variable con declare estás restringiendo su ámbito a la función donde lo hayas declarado. Es decir, básicamente es como si utilizas local. Así algunos ejemplos, declare -ir entero=10 echo "Este es un entero de valor $entero" entero=10.5 Al ejecutar las instrucciones anteriores, te aparecerá un mensaje de error con el siguiente texto -bash: entero: variable de sólo lectura. EXPR La segunda de las opciones para realizar operaciones matemáticas en Bash es utilizando expr. Se trata de un antigua aplicación de Unix, utilizada cuando Bourne Shell, no soportaba operaciones matemáticas. Sin embargo, hoy por hoy no tiene tanto sentido su uso. Ten en cuenta que necesitarás espacios entre los operandos y el operador. Así por ejemplo, echo $(expr 1+1) te devolverá 1+1, mientras que echo $(expr 1 + 1) te devolverá, como esperas, 2. Así algunos ejemplos, echo $(expr 5 \* 5) devuelve 25, y si, hay que escapar el signo de multiplicación. d=1;echo $(expr $d + 1 ) devuelve 2. LET Otra opción para realizar operaciones matemáticas es let. let evalua cada argumento como una expresión aritmética. Las operaciones se evaluan como enteros, mientras que una división por cero arrojará un error. De nuevo, las cosas se ven mas claras con unos ejemplos, let z=25; echo $z Devuelve 25 let z++; echo $z Devuelve 26 let z=z+10; echo $z. Devuelve 36 DOBLES PARENTESIS. Como ya viste en un capítulo anterior del tutorial, otra opción para realizar operaciones matemáticas, es el uso de los dobles paréntesis. Al fin y al cabo, los dobles paréntesis se comportan como let que acabas de ver. Aunque tienen la ventaja de que un doble paréntesis puede incluir a otro doble paréntesis. De esta manera, los ejemplos que te he indicado para let se pueden hacer exactamente igual para el caso de los dobles paréntesis, ((z=25)); echo $z Devuelve 25 ((z++)); echo $z Devuelve 26 ((z=z+10)); echo $z. Devuelve 36 Pero además, si quieres devolver el resultado de una operación simplemente tienes que preceder el doble paréntesis con $, es decir, puedes simplificar los ejemplos anteriores de la siguiente manera, echo $((z=25)); Devuelve 25 echo $((z++)); Devuelve 26 echo $((z=z+10));. Devuelve 36 Esto ta va a permitir, como he adelantado anteriormente, incluir una operación matemática dentro de otra. Por ejemplo, `echo $((25 + $((5+5)))) o incluso echo $((25 + $((diez=5+5))));echo $diez MATEMATICAS EN BASH CON BC. Como ya te has dado cuenta, todas las operaciones matemáticas realizadas hasta el momento solo implican números enteros. Sin embargo, ¿que sucede cuando quieres realizar operaciones matemáticas con números reales?. En este caso necesitarás recurrir a una herramienta como es bc. bc es una herramienta que funciona exactamente como una calculadora matemática. Tu le pasas una serie de operaciones, y esta herramienta se encarga de evaluarla. Un par de ejemplos sencillos, echo '4.1+5.2' | bc devuelve 9.3 echo '4.1*5.2' | bc devuelve 21.3 Si quieres guardar el resultado de la operación en una variable, tienes que modificar los ejemplos anteriores como sigue, z=$(echo '4.1+5.2' | bc);echo $z devuelve 9.3 z=$(echo '4.1*5.2' | bc);echo $z devuelve 21.3 También es posible definir variables. Sin embargo, estas variables son locales a bc, es decir, luego no las vas a poder utilizar fuera de la expresión que le has pasado a la herramienta bc. Es decir, echo 'var=10;var++;var' | bc te devolverá 11. Sin embargo si ejecutas echo $var no obtendrás valor alguno. bc admite operadores incrementales y decrementales, incluidos los precedentes. Me refiero a ++ y --. Así, echo 'var=10;++var' | bc devolverá 11 echo 'var=10;var++' | bc devolverá 10 COMPARACIONES. bc soporta comparaciones, teneiendo en cuenta que en todos los casos 1 es quivalente a True y 0 es equivalente a False, como puedes ver en los siguientes ejemplos, echo '2 > 1' | bc devuelve 1 echo '1 != 2' | bc devuelve 1 echo '2 > 1 && 2 != 1' | bc devuelve 1 FUNCIONES MATEMATICAS Igualmente bc soporta algunas funciones matemáticas que te pueden resultar de gran utilidad. Algunas de estas funciones matemáticas son las siguientes, s(x) para calcular el seno de un ángulo en radianes c(x) para calcular el coseno de un ánguno en radianes a(x) te permite calcular el arcotangente l(x) para calcular el logaritmo e(x) esta función te permite calcular la exponencial de un número sqrt(x) para cacular la raíz cuadrada Por otro lado tienes un par de funciones que seguro te serán de gran utilidad, length(x) te indica el número de dígitos de un valor scale(x) si la función anterior te permite saber los dígitos de un valor, con esta función puedes establecer el número de dígitos con los que se devolverán los resultados. |
Si te gusta este contenido, se agradece tu apoyo en su mantenimiento. Cualquier cantidad por pequeña que sea será bien recibida.
Muchas gracias.
Comentarios recientes
- Gonzalo Reiser A. en BASH – SCRIPT para monitoreo de archivo LOG.-
- Gonzalo Reiser A. en BASH – SCRIPT para monitoreo de archivo LOG.-
- Victor Hugo en BASH – SCRIPT para monitoreo de archivo LOG.-
- Gonzalo Reiser A. en BASH – Script para monitorear los servicios en ejecución de un servidor.-
- Julio jarquin Guevara en BASH – Script para monitorear los servicios en ejecución de un servidor.-
Archivos
- agosto 2024 (1)
- julio 2024 (12)
- enero 2024 (10)
- diciembre 2023 (1)
- noviembre 2023 (10)
- septiembre 2023 (5)
- agosto 2023 (10)
- junio 2023 (3)
- mayo 2023 (4)
- abril 2023 (10)
- febrero 2023 (3)
- enero 2023 (1)
- diciembre 2022 (2)
- noviembre 2022 (1)
- agosto 2022 (4)
- julio 2022 (1)
- junio 2022 (4)
- febrero 2022 (9)
- abril 2021 (1)
- enero 2021 (3)
- diciembre 2020 (2)
- noviembre 2020 (2)
- octubre 2020 (1)
- septiembre 2020 (4)
- agosto 2020 (1)
- julio 2020 (1)
- junio 2020 (5)
- mayo 2020 (12)
- abril 2020 (1)
- enero 2020 (1)
- noviembre 2019 (5)
- octubre 2019 (4)
- septiembre 2019 (1)
- agosto 2019 (1)
- julio 2019 (11)
- junio 2019 (1)
- julio 2018 (3)
- octubre 2017 (1)
- septiembre 2017 (2)
- agosto 2017 (3)
- julio 2017 (11)
- mayo 2017 (6)
- abril 2017 (3)
- marzo 2017 (7)
- febrero 2017 (1)
- diciembre 2016 (3)
- octubre 2016 (4)
- septiembre 2016 (2)
- agosto 2016 (10)
- julio 2016 (9)
- junio 2016 (9)
- mayo 2016 (27)
- abril 2016 (10)
- marzo 2016 (15)
- enero 2016 (3)
- diciembre 2015 (7)
- octubre 2015 (2)
- septiembre 2015 (3)
- agosto 2015 (9)
- julio 2015 (11)
- junio 2015 (22)
- mayo 2015 (7)
- abril 2015 (22)
- marzo 2015 (5)
- febrero 2015 (2)
- enero 2015 (10)
- diciembre 2014 (7)
- noviembre 2014 (3)
- octubre 2014 (2)
- septiembre 2014 (4)
- agosto 2014 (22)
- julio 2014 (15)
- junio 2014 (8)
- mayo 2014 (6)
- abril 2014 (10)
- marzo 2014 (15)
- febrero 2014 (3)
- enero 2014 (15)
- diciembre 2013 (11)
- noviembre 2013 (25)
- octubre 2013 (46)
- septiembre 2013 (30)