Я ищу способ сделать быстрые вычисления в терминале (использование утилит, доступных в минимальной Ubuntu) и получить точные ошибки сбоя, когда математический синтаксис является неправильным, например: cli-calculator "foo+bar" || echo invalid math syntax
Некоторые исходные данные были бы:
1+1 #should печатают 2 и возвращают 0 кодов
5/2 #should печатают 2.5 и возвращают 0 кодов
1/0 #should возвращают не 0 кодов
foo+bar #should возвращают не 0 кодов
Я попробовал bc
, окружите интегрированную арифметику, expr
, awk
, perl
и python
но до сих пор ни один не удовлетворил полностью мои требования, таким образом, я ищу альтернативы, следую за вариантами использования:
bc
, это может сделать операции с числами плавающими, но не возвращает коды ошибок на входе недопустимого синтаксиса
$ echo "1/0" | bc -l && echo all is fine || echo math syntax error
Runtime error (func=(main), adr=3): Divide by zero
all is fine
$ echo "foo+bar" | bc -l && echo all is fine || echo math syntax error
0 #should return an error
all is fine
Shell интегрировал арифметику и expr
, не поддерживайте операции с числами плавающими и возвращайте действительные коды недопустимого математического входа
$ echo $((5/2))
2 #should return 2.5
$ echo $((foo+bar))
0 #should return an error
$ expr 5 / 2
2 #should return 2.5
$ expr foo+bar
foo+bar #should return an error
awk
|perl
, не возвращайтесь недопустимые коды состояния по недопустимой математике вводят.
$ awk "BEGIN {print foo+bar; exit}"
0 #should return a non 0 number and probably output an error
$ echo "foo+bar" | perl -ple '$_=eval'
0 #should return a non 0 number and probably output an error
python
, поддержки пускают в ход арифметические операции и ошибки статуса возврата на недопустимом математическом синтаксисе, но это медленно.
$ python -c 'from __future__ import division; from math import *; print(foo+bar)' && echo all fine || echo math syntax error
NameError: name 'foo' is not defined
math syntax error #good!
$ python -c 'from __future__ import division; from math import *; print(5/2)' && echo all fine || echo math syntax error
2.5` #good!
all fine
Какие-либо идеи?
Октава является другой альтернативой. Это - очень мощный бесплатный инструмент с синтаксисом 'как коммерческий инструмент matlab'. Если Вы хотите выполнить его без gui, используйте опцию --no-gui
или Пример команды octave-cli
.
sudo apt-get install octave octave-info
на основе Ваших 'допустимых и недопустимых' выражений:
$ octave --no-gui
GNU Octave, version 4.0.0
Copyright (C) 2015 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. For details, type 'warranty'.
Octave was configured for "i686-pc-linux-gnu".
Additional information about Octave is available at http://www.octave.org.
Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html
Read http://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type 'news'.
>> 1+1 #valid
ans = 2
>> 5/2 #valid
ans = 2.5000
>> 1/0 #invalid
warning: division by zero
ans = Inf
>> foo+bar #invalid
error: 'foo' undefined near line 1 column 1
>> foo=1;bar=2 # assign values to foo and bar
bar = 2
>> foo+bar #now valid
ans = 3
>>
Что относительно calc
sudo apt-get install apcalc
Примеры
% calc 1/0
Error 10001
% calc foo + bar
"foo" is undefined
Error in commands
% calc 5/2
2.5
Или qalc
% qalc 1/0
error: Division by zero.
1 / 0 = 1 / 0
% qalc foo + bar
error: "foo" is not a valid variable/function/unit.
0 + bar = 1 bar
% qalc 5/2
5 / 2 = 2.5
bc
echo "1/0" | bc
Runtime error (func=(main), adr=3): Divide by zero
echo "scale=1; 5/2" | bc
2.5
И это корректно, 0 + 0 0
% echo "foo+bar" | bc
0
Или gcalccmd
, консольная версия gnome-calculator
калькулятор Рабочей среды GNOME.
Примеры
% gcalccmd
> 1/0
Error (null)
> foo + bar
Error 3
> 5/2
2,5
Отметьте это gcalccmd
не имеет поддержки readline, поэтому только самые основные особенности редактирования строки доступны. (Работы клавиши Backspace, но слева/справа ключи не делают),