Я нахожусь под 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
где проблема?
Bash не выполняет арифметику с плавающей запятой; только целочисленная арифметика. Для сравнения или вычисления с плавающей точкой необходимо задействовать внешние команды, такие как bc или awk. См. Как вычислить числа с плавающей запятой вместо целых чисел?
Ваш цикл 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