BASH – Operaciones y comparación de números con decimales en Scripts BASH.

En BASH no es posible ( de manera nativa) realizar operaciones con números decimales.  Para superar esta limitación de BASH, se utiliza el comando “bc”, con el cual se pueden realizar operaciones con números decimales, también se puede indicar la cantidad de números decimales que entregara en el resultado. Algunos ejemplos de código :

#!/bin/bash
# Cantidad de números pasados como argumentos
CANT_ARGUMENTOS=$#
# Separador de argumentos
IFS='+'
# Reunimos todos los argumentos incluyendo el separador
SUMA=$(echo "$(( $* ))")
# Calculamos el promedio
PROMEDIO=$(echo "scale=2; $SUMA/$CANT_ARGUMENTOS" | bc)
#Mostramos el mensaje por pantalla
echo "El promedio de los números ingresados es $PROMEDIO"

Otros ejemplos de linea de comandos :
echo "scale=4; 20/3" | bc -l
6.6666

Acá ingresaremos 2 valores, los cuales pueden ser positivos, negativo o decimal. El programa los valida que realmente correspondan a un número. Posterior a esto despliega el número menor ingresado :

#!/bin/bash
val1=$1
val2=$2
re='^[+-]?[0-9]+([.][0-9]+)?$'
if ! [[ $val1 =~ $re ]] || ! [[ $val2 =~ $re ]] ; then
   echo "error: Solo se aceptan numeros"
   exit
fi
min=$(echo $val1 $val2 | awk '{if ($1 < $2) print $1; else print $2}')
echo ""
echo "Valor minimo ingresado = $min"
exit

Ahora mostraremos la comparación de números decimales, para realizar esto, lo haremos con ayuda del lenguaje AWK (script adaptado para NAGIOS) , chequeo de UPTIME, el SCRIPT solicita se ingrese el WARNING y CRITICO de proceso y lo compara con el primer valor (Carga del sistema al minuto) :

#!/bin/bash
warning=$1
critical=$2
VARIABLE=`uptime`
IFS=',' read -ra datos <<< "$VARIABLE"
a=`echo "${datos[3]}" | cut -d ":" -f2`; b="${datos[4]}"; c="${datos[5]}"
up=`echo $a$b$c`
re='^[+]?[0-9]+([.][0-9]+)?$'
if ! [[ $warning =~ $re ]] || ! [[ $critical =~ $re ]] ; then
   echo "UNKNOWN - Load Average $up"
   exit 3
fi
if (( $(echo $a $warning $critical | awk '{if ($1 >= $2 && $1 < $3) print 1;}') )); then
     echo -e "WARNING - Load Average $up"
     exit 1
elif (( $(echo $a $critical | awk '{if ($1 >= $2) print 1;}') )); then
     echo -e "CRITICAL - Load Average $up"
     exit 2
else
     echo "OK - Load Average $up"
     exit 0
fi
AL EJECUTAR EL SCRIPT, MOSTRARIA ALGO COMO :

bash check_uptime.sh 20 50

WARNING  - Load Average  35.20  45.30  48.30

Esta entrada fue publicada en Unix - Linux. Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *