Есть ли хороший инструмент для анализа / оценки математических выражений?

Argghh:

$ echo 2 4 | До нашей эры
(standard_in) 1: ошибка разбора
$ echo $?
0

С какой стати в противном случае совершенно разумная программа будет успешной, если она распознает ошибку разбора? Ясно, что я не могу использовать bc для оценки выражения. Лично мне нравится dc, но мои пользователи не хотят, чтобы его отполировали. Учитывая арифметическое выражение формы, которую распознает bc, существует ли разумная программа для оценки результата? Или есть способ сделать БК разумным? (Здесь "разумный" означает, что он терпит неудачу, когда ввод ложный.)

2 ответа

Решение

bc постараюсь восстановиться после ошибок и продолжит обработку последующих заявлений. Например:

$ echo "2 + 3; 
    4 4;
    3 + 4" | bc
5
(standard_in) 2: parse error
7

Таким образом, не ясно, должна ли она возвращать ошибку в этом случае. Он успешно проанализировал и обработал ввод, корректно восстанавливаясь после ошибки и продолжая обрабатывать более поздние инструкции. Согласно POSIX, поведение bc не определено, когда в неинтерактивном режиме обнаружен неверный ввод, так что это в пределах спецификации того, как bc должен вести себя

Если вы хотите проверить, были ли какие-либо ошибки при обработке вашего ввода, вы можете перенаправить stderr во временный файл, а затем проверить его содержимое на наличие ошибок:

bcerr=$(mktemp -t bcerr)
result=$(echo 2 4 | bc 2>$bcerr)
if test -s $bcerr
then
  # handle errors
else 
  # handle success
fi
rm $bcerr

Вы можете поймать ошибку от bc просматривая вывод stderr или просто перенаправляя stderr в /dev/null и распознавая, когда вывод пуст:

answer=$(echo "$expression" | bc 2>/dev/null)
if [ -z "$answer" ]; then
    echo "error in $expression"
fi
Другие вопросы по тегам