проблема сравнения в bash-скрипте

Я нахожусь под Ubuntu 11.10, когда я выполняю эту программу в bash, у меня появляется следующая ошибка:

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

строка 25:

while [ $p -le 1.0 ]

в следующем контексте [ 115]

p=0.1

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

где проблема?

1
задан 19 March 2012 в 14:40

2 ответа

Bash не выполняет арифметику с плавающей запятой; только целочисленная арифметика. Для сравнения или вычисления с плавающей точкой необходимо задействовать внешние команды, такие как bc или awk. См. Как вычислить числа с плавающей запятой вместо целых чисел?

0
ответ дан 19 March 2012 в 14:40

Ваш цикл while может быть заменен циклом for. Поскольку Bash не может обрабатывать арифметику с плавающей запятой, вы должны вместо этого использовать обычные целые числа и использовать программу типа bc для создания чисел с плавающей запятой. Команда scale=1; перед $i/10 гарантирует, что всегда есть один десятичный знак (например, 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

Это эквивалентно:

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 <<<... - это аккуратный трюк, который записывает ... на стандартный вход command и эквивалентен echo ... | command

0
ответ дан 19 March 2012 в 14:40

Другие вопросы по тегам:

Похожие вопросы: