Como comparar dois valores flutuantes em ksh?

3

Para comparar os valores float abaixo, o comando está funcionando bem no bash, mas não funciona em ksh no AIX.

if (( $(bc <<< " 5.3 >= 5.3") ));then echo "hi";else echo "bye";fi',

Eu tentei de muitas maneiras, alguém pode me sugerir para conseguir isso?

    
por Sriram P 07.06.2017 / 18:48

3 respostas

3

Pelo padrão POSIX para bc :

Unlike all other operators, the relational operators ( '<', '>', "<=", ">=", "==", "!=" ) shall be only valid as the object of an if, while, or inside a for statement.

Parece ser uma extensão GNU / Linux para permitir que comparações simples sejam avaliadas como verdadeiras ou falsas.

Em vez de verificar a saída de bc para 1 ou 0, use apenas test diretamente:

if [ 5.3 -ge 5.3 ]; then echo hi; else echo bye; fi

ou use a expansão aritmética (ksh93):

if (( 5.3 >= 5.3 )); then echo hi; else echo bye; fi

ou use o awk:

if awk -v x=5.3 -v y=5.3 'BEGIN { exit (x >= y) ? 0 : 1 }'; then echo hi; else echo bye; fi
    
por 07.06.2017 / 19:20
0

Você também pode verificar os valores assim:

$ fat=5.3
$ slim=5.3
$ echo $fat'>'$slim | bc -l
0
$ echo $fat'>'$slim | bc -l
0
$ echo $fat'=='$slim |bc -l
1

Saída: 0 = false e 1 = true

    
por 07.06.2017 / 19:46
0

Você pode usar o utilitário dc para fazer math no shell. O comando imprimirá um hi para stdout quando $ n1 > = $ n2, caso contrário, será exibido bye .

n1=5.3 n2=5.3
dc -e "[[hi]]sa [r]sb $n1 $n2 !>a [bye] z2=bp"
       $n1  $n2   o/p
 1.    5.3, 5.3 => hi
 2.    5.3, 5.2 => hi
 3.    5.3, 5.4 => bye
    
por 07.06.2017 / 19:51