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