2012-07-18 10 views
17
lock_percent=$(echo "scale = 5; $value2*100/$value1" | bc) 
value=`echo "$lock_percent" | bc` 

    if [[ "$value" > "$8" ]]; then 
     echo "Lock Percentage:$value percentage State Critical" 
     exit $STATE_CRITICAL 
    fi 

Nie jestem w stanie wykonać porównania z tym float. Nie jestem w stanie zrozumieć, gdzie idę źle.Jak przeprowadzić porównanie float w Bash?

Odpowiedz

24

Bash sam nie może używać pływaka. W tym przypadku możesz pomnożyć przez 10 lub 100 (itd.) I uzyskać wartość całkowitą, którą możesz porównać. Albo można użyć BC porównanie i zwracanej wartości:

echo "10.2>10.1" | bc 
+11

Można również zrobić 'bc <<< "10.2> 10,1" ', która jest szybsza :) – Bernhard

13
# float number comparison 
fcomp() { 
    awk -v n1="$1" -v n2="$2" 'BEGIN {if (n1+0<n2+0) exit 0; exit 1}' 
} 

# test and example 
fcomp_test() { 
    if fcomp "$1" "$2"; then 
     echo "$1<$2" 
    else 
     echo "$1>=$2" 
    fi 
} 

fcomp_test 0.0 0.1 
fcomp_test 0.1 0.1 
fcomp_test -0.1 0.1 
fcomp_test 1e3 1e4 
fcomp_test -1.34e3 1.03e4 
fcomp_test ' 0 ' ' 1 ' 
+1

Jeśli usunięto 'słowa kluczowego zakresie funkcji, byłoby być znacznie mniej specyficzne dla bashu.Zauważ również 'awk -v n1 =" $ 1 "-v n2 =" $ 2 "' i 'fcomp" $ 1 "" $ 2 "' - w ten sposób wartości nie podlegają podziałowi na łańcuchy i globalna ekspansja (na pewno, gdyby to było poprawnie użyte, wszystkie będą liczbami, ale lepiej upewnić się, że złe użycie skutkuje ładnym użytecznym błędem na temat nieprawidłowego numeru zamiast znacznie bardziej arbitralnego błędu) –

+0

@CharlesDuffy done. – slitvinov

Powiązane problemy