Comment comparer les valeurs float dans un script shell?

J'ai besoin d'alerter si ma moyenne de charge est supérieure à 10.

Je pourrais le faire comme ceci si ma command awk renvoyait un entier:

declare -i MAX_LOAD=10 declare -i L1=`cat /proc/loadavg | awk {'print $1'}` if [ $L1 -gt $MAX_LOAD ] then echo "Alert" fi 

Mais il renvoie la valeur flottante dans L1 (par exemple, 2,35).

Comment puis-je comparer les valeurs de ce scénario?

Comme vous utilisez déjà awk, la méthode la plus simple consiste à faire la comparaison float dans cette langue:

 MAX_LOAD=10.0 if ! </proc/loadavg awk -vmax_load=$MAX_LOAD '{ exit $1 > max_load }' then echo Alert fi 

Notez qu'il y a un peu de supercherie: le ! l'opérateur inverse le test. Cela est nécessaire car l'expression booleanne dans awk et le code d'état que la construction if reçoit des valeurs ont des significations opposées. Le < est utilisé pour diriger le file /proc/loadavg dans l'input standard de awk. Appeler awk avec -vmax_load=$MAX_LOAD définit la variable awk max_load sur la valeur de la variable shell MAX_LOAD .

Dans votre cas particulier, étant donné que votre MAX_LOAD est un entier et que vous lisez le premier float d'un file, une solution ad-hoc serait:

 if [ $(</proc/loadavg cut -f1 -d.) -gt $MAX_LOAD ] ... 

L'appel à cut va extraire la partie intégrale du premier numéro dans /proc/loadavg . L'idée tombe en panne si l'une des hypothèses énoncées ci-dessus devient fausse, cependant.