2012-03-30 9 views
2

In Shell-Skript können wir vergleichen (Integer und Fließkomma), (Fließkomma und Fließkomma), (Fließkomma und Integer), (Integer und Integer) mit nur einem wenn Bedingung.Vergleich von Ganzzahl- und Fließkommazahlen im Shell-Skript

Ich habe einige Beispiele wie

set X=3.1 
    set Y=4.1 
    if [ $X < $Y ] then 
    echo "wassup" 
    endif 

Aber die oben von cron-Job tut laufen zu funktionieren scheint.

+0

Mögliche Duplikat von [Bash: Integer Ausdruck erwartet] (http: // Stackoverflow.com/questions/17958855/bash-integer-expression-expected) – tripleee

Antwort

11

Der Weg zur Ausführung von Gleitkommaoperationen in bash besteht in der Verwendung von bc, die auf fast allen Linux-Distributionen verfügbar ist.

# bc will return 0 for false and 1 for true 
if [ $(echo "23.3 > 7.3" | bc) -ne 0 ] 
then 
    echo "wassup" 
fi 

Es gibt eine good article auf Linux Journal verfügbar über Punkt Mathe in bash bc mit Floating.

+0

ich versuchte folgendes und bekam einen Fehler als unary operated erwartet – Rajeev

+0

interessant. Ich habe es hier gut funktioniert. Hmmm. Was Ihr Fehler bedeutet (ich denke), ist, dass das '$ (echo" $ a> $ b "| bc)' keinen Wert zurückgegeben hat. Kannst du die Subshell selbst ausprobieren? – brice

+0

IE: Ihre Variablen sind nicht korrekt zugewiesen. "echo $ X" ist zum Beispiel eine leere Zeile. – brice

0

unten Beispiel funktioniert auf Bash Shell.

X=3.1 
Y=4.1 
if [ $X -le $Y ] 
then 
    echo "wassup" 
fi 

Sie möchten Shell-Skript here

+2

Dies funktioniert hier nicht, da bash nicht mit Gleitkommazahlen arbeitet: '$ test" 34.4 "-gt" 5.4 "-> bash: test: 34.4: ganzzahliger ausdruck erwartet ' – brice

+0

dies ist ein getesteter code auf solaris 10 und bash shell –

+4

Ich zweifle nicht an deiner Aufrichtigkeit :) Ich sage nur, dass dies nicht garantiert, um auf Linux zu arbeiten 'bash --version' gibt mir 'GNU Bash, Version 4.2.8 (1) -Release (x86_64 -pc-linux-gnu) ' – brice

0

EDIT lernen. basierend auf den Kommentare zu dieser Antwort (dank Benutzer unbekannt und glenn jackman), so scheint es, dass, wenn bc für einen wahr/falsch Test, die erforderlich bash Test ist einfach:

  • (($(echo "$X < $Y" |bc))) ... die Testergebnisse und Skript unter

wheras sehen, der Vergleich zu -ne 0 für den alten Stil bash [ ] Test benötigt.


bash nicht nativ verarbeiten Gleitkommazahlen, aber Sie können wie bc

Von man bcein Dienstprogramm aufrufen - Ein beliebiger Genauigkeit Rechner Sprache

X=3.1 
Y=4.1 
# This test has two superfluous components. 
# See EDIT (above) and TESTS below 
if (($(echo "scale=9; $X < $Y" |bc)!=0)) ;then 
    echo "wassup" 
fi 

TEST Ergebnisse:

if [ "1" ] true 
    [ "1" ] true 
if [ "0" ] true 
    [ "0" ] true 

if [ 1 ] true 
    [ 1 ] true 
if [ 0 ] true 
    [ 0 ] true 

if (("1")) true 
    (("1")) true 
if (("0")) false 
    (("0")) false 

if (( 1 )) true 
    (( 1 )) true 
if (( 0 )) false 
    (( 0 )) false 

echo "1<1"|bc true 
echo "1<0"|bc true 

Testskript:

printf 'if [ "1" ] '; if [ "1" ]; then echo true; else echo false; fi 
printf ' [ "1" ] '; [ "1" ] && echo true || echo false 
printf 'if [ "0" ] '; if [ "0" ]; then echo true; else echo false; fi 
printf ' [ "0" ] '; [ "0" ] && echo true || echo false 
echo 
printf 'if [ 1 ] '; if [ 1 ]; then echo true; else echo false; fi 
printf ' [ 1 ] '; [ 1 ] && echo true || echo false 
printf 'if [ 0 ] '; if [ 0 ]; then echo true; else echo false; fi 
printf ' [ 0 ] '; [ 0 ] && echo true || echo false 
echo 
printf 'if (("1")) '; if (("1")); then echo true; else echo false; fi 
printf ' (("1")) '; (("1")) && echo true || echo false 
printf 'if (("0")) '; if (("0")); then echo true; else echo false; fi 
printf ' (("0")) '; (("0")) && echo true || echo false 
echo 
printf 'if (( 1 )) '; if ((1)); then echo true; else echo false; fi 
printf ' (( 1 )) '; ((1)) && echo true || echo false 
printf 'if (( 0 )) '; if ((0)); then echo true; else echo false; fi 
printf ' (( 0 )) '; ((0)) && echo true || echo false 
echo 
printf 'echo "1<1"|bc '; echo "1<1"|bc >/dev/null && echo true || echo false 
printf 'echo "1<0"|bc '; echo "1<0"|bc >/dev/null && echo true || echo false 
+1

' scale' ist überflüssig, wenn Sie nur für wahr und falsch testen möchten. '! = 0 'ist auch überflüssig - das ist schon erledigt. –

+0

@user unbekannt: Danke .. –

+1

Das '! = 0 'ist * nicht * überflüssig: bc * druckt * 0 oder 1 für falsch oder wahr. In beiden Fällen ist der * Exit-Status * gleich Null. Also müssen Sie die Befehlsausgabe mit etwas vergleichen. –

1

Bah selbst behandelt nur ganze Zahlen. Verwenden Sie bc:

echo "$X>$Y" | bc 
0 
echo "$X<$Y" | bc 
1 

Sie nicht über Maßstab müssen sich Sorgen zu machen. Es ist nur für die preocision von Ausgabeformaten:

X=3.000001 
Y=3.0001 
echo "$X>$Y" | bc 
0 
echo "$X<$Y" | bc 
1 
echo "scale=1;$X<$Y" | bc 
1 
Verwandte Themen