Не использовать $(())
.
Например, принимая соответствующую часть вашего расчета:
s=$(bc <<<"$s + ((${flowx[a+1]} - ${flowx[a]}) * (${flowy[a+1]} + ${flowy[a]}))/2")
до тех пор, как flowx
и flowy
являются стандартные целочисленные индексированные массивы, а не ассоциативные массивы, вам даже не нужно использовать $(())
при индексации в них (или $
операторов внутри этих индексов), поскольку индекс неассоциативного массива в bash по умолчанию является математическим контекстом.
Или, более читаемо, чем все эти вложенности скобок, используйте dc
(здесь, сконфигурированный с 10 цифр точности):
s=$(dc <<EOF
10 k
${flowx[a+1]}
${flowx[a]}
-
${flowy[a+1]}
${flowy[a]}
+
*
$s +
2/
p
EOF
)
See? Много более читаемый.
BashFAQ # 22 - ваш друг - http://mywiki.wooledge.org/BashFAQ/022 - но он говорит вам использовать только 'bc', который ... ну, да. Используйте 'bc', не используйте' $ (()) '. Поскольку вы уже знаете, что 'bc' существует и что он может делать математику с плавающей запятой, как это вопрос? –
Можете ли вы привести пример чисел, которые вы используете через эту вещь? Что вы пытаетесь достичь в любом случае? – lxg
Вы рассматривали использование awk/perl/python/ruby? – dawg