-le problema de comparação no script bash

1

Estou no Ubuntu 11.10, quando executo este programa no bash tenho o seguinte erro:

exec.bash: line 25: [: 0.1: integer expected as an expression

a linha 25 é:

while [ $p -le 1.0 ]

no contexto a seguir

p=0.1

while [ $p -le 1.0 ]
do
    echo ----probability---- $p
    java $jvmargs -classpath $CP jbenchmarker.MainSimulation $p
    (( p= $p + 0.1 ))
done

onde está o problema?

    
por user1149157 19.03.2012 / 09:57

2 respostas

6

Seu loop while pode ser substituído por um loop for. Como o Bash não pode lidar com aritmética de ponto flutuante, você deve usar números inteiros normais e usar um programa como bc para criar floats. O comando scale=1; antes de $i/10 garante que sempre haja um único decimal (por exemplo, 0,1).

for ((i=1; i<=10; i++))
do
    p=$(bc <<<"scale=1;$i/10")
    echo ----probability---- $p
    java $jvmargs -classpath $CP jbenchmarker.MainSimulation $p
done

Isso é equivalente a:

i=1
while ((i<=10))
do
    p=$(bc <<<"scale=1;$i/10")
    echo ----probability---- $p
    java $jvmargs -classpath $CP jbenchmarker.MainSimulation $p
    ((i++))
done

command <<<... é um truque que grava ... na entrada padrão de command e é equivalente a echo ... | command

    
por Lekensteyn 19.03.2012 / 10:58
2

Bash não faz aritmética de ponto flutuante; apenas aritmética inteira. Para comparar ou calcular com floats, você precisa envolver comandos externos, como bc ou awk. Veja Como posso calcular com números de ponto flutuante em vez de apenas inteiros?

    
por geirha 19.03.2012 / 10:41