Почему expr не выполняет арифметику с действительным числом в сценарии оболочки?

a=10.5
b=11.8
c=`expr $a + $b | bc`
echo $c

После выполнения отображается сообщение об ошибке, подобное non-integer argument. Почему это не выполняет арифметику с использованием expr?

0
задан 25 March 2016 в 06:48

2 ответа

Объяснение ошибок

Ошибка совпадает с, если Вы вводите:

$ expr 10.5 + 11.8
expr: non-integer argument

Expr жалуется, что Вы дали ему нецелые числа. Это вызвано тем, что expr программа не была разработана для вычислений нецелого числа:

Вызов Expr:

Операнды являются или целыми числами или строками.

  • expr был сгенерирован как стандартная погрешность, Ваш терминал просто отображает ее
  • Но когда Вы используете канал |, передайте по каналу только стандарт передач, не стандартную погрешность
  • Поскольку bc не получил ничего для работы с, это не дало Вам вывода вообще, поскольку Вы видите, когда Вы пытаетесь ничего не отправить (кроме новой строки) к bc:

    $ echo | bc
    

Результат bc не говорит ничто. Таким образом, то, что Вы видите на своем экране с Вашей исходной командой, было все еще справедливо exprжалоба через стандартную погрешность.

Рекомендация

Для десятичных вычислений можно использовать просто bc и некоторые средства, которые будут введены к bc, такой как со здесь-строками:

$ bc <<< '10.5 + 11.8'
22.3

Или, для использования переменных:

$ a=10.5
$ b=11.8
$ c=$(bc <<< "$a + $b")
$ echo $c
22.3
  • $( и ) замена команды
  • <<< string здесь-строковый синтаксис, отправляет строковое содержание в stdin, который до н.э получает
0
ответ дан 25 March 2016 в 16:48
  • 1
    Привет там, я использовал нано GNU для создания его так, это должно быть хорошо. Я попробовал ре, делающее сценарий несколько раз, но все еще получаю это.. './test.sh: строка 2: синтаксическая ошибка около неожиданного маркерного '$ ' do\r' ' ' – Ben Robins 27 June 2017 в 01:25

info coreutils 'expr invocation' говорит:

16.4 `expr': Evaluate expressions
=================================

`expr' evaluates an expression and writes the result on standard
output.  Each token of the expression must be a separate argument.

   Operands are either integers or strings.  Integers consist of one or
more decimal digits, with an optional leading `-'.  `expr' converts
anything appearing in an operand position to an integer or a string
depending on the operation being applied to it.

Однако можно использовать bc:

$ a=10.5 b=11.8 c=$(echo "scale=1;$a + $b" | bc -q );echo $c
22.3
0
ответ дан 25 March 2016 в 16:48
  • 1
    Спасибо А-ч, dos2unix, кажется, решил ту проблему. Выполнение сценария дает следующие ошибки.. – Ben Robins 27 June 2017 в 01:37

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

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