cli калькулятор, который распознает неправильный математический синтаксис?

Я ищу способ сделать быстрые вычисления в терминале (использование утилит, доступных в минимальной 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
    

Какие-либо идеи?

0
задан 8 February 2017 в 21:43

2 ответа

Октава является другой альтернативой. Это - очень мощный бесплатный инструмент с синтаксисом 'как коммерческий инструмент 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
>> 
1
ответ дан 30 September 2019 в 06:02

Что относительно 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, но слева/справа ключи не делают),

3
ответ дан 30 September 2019 в 06:02

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

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