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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/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 :
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/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) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/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 |
1 2 3 4 5 |
AL EJECUTAR EL SCRIPT, MOSTRARIA ALGO COMO : bash check_uptime.sh 20 50 WARNING - Load Average 35.20 45.30 48.30 |