Как работает арифметика Баша?

read num1 2 read num2 5 echo "$((num1+num2))" 7 echo "$(($num1+$num2))" 7 

Я сослался на это .

Я не понимаю, как эти два выражения дают одинаковый результат? Пожалуйста, объясни.

  echo "$[num1+num2]" 

Это не работает, как предложено в этом вопросе. Я делаю что-то неправильно?

  echo 'expr "$num1" + "$num2"` 

также не работает. Пожалуйста, предоставьте несколько предложений.

2 Solutions collect form web for “Как работает арифметика Баша?”

В оболочке POSIX арифметическое расширение имеет форму:

 $((expression)) 

Если выражение содержит переменные, и эти переменные содержат допустимое целочисленное значение – положительный плюс или минус – штраф – тогда "$((var))" и "$(($var))" вернут тот же результат (Примечание: использование неанализированных данных в оценке арифметики Shell приводит к последствиям безопасности).

Форма $ [выражение] не определена POSIX, устарела и будет удалена в следующей версии bash .

Утилиту expr можно использовать для арифметики. В вашем случае вы использовали неправильный синтаксис для подстановки команд , это обратная сторона, а не одна цитата:

 echo `expr "$num1" + "$num2"` 

Но вместо этого вы должны использовать форму "$()" .

Чтобы оценить арифметическое выражение, оболочка сначала расширяет переменные и подстановки команд внутри него. Например, в echo "$(($num1+$num2))" первое, что происходит, это то, что $num1 и $num2 заменяются значениями переменных. Выражение становится 2+5 . Это анализируется как арифметическое выражение и оценивается до числа 7. Результатом разбора и расширения "$(($num1+$num2))" является, таким образом, 7 .

Арифметические выражения могут содержать имена переменных. Их оценивают до значения переменной. Таким образом, $((num1+num2)) является арифметическим выражением num1+num2 (тогда как $(($num1+$num2)) является арифметическим выражением 2+5 ). В этом случае результат будет таким же.

Два выражения отличаются друг от друга, когда значение num2 или num2 – это не просто последовательность цифр. Например, рассмотрим следующий фрагмент:

 a="1+2" echo "$(($a * 4))" echo "$((a * 4))" 

Во второй строке оценивается арифметическое выражение 1+2 * 4 . Это анализируется как 1 + (2 × 4), поскольку умножение имеет более высокий приоритет, чем добавление. Тот факт, что знак плюса пришел от расширения переменной, забывается к моменту проведения арифметической оценки. Результатом является число 9, поэтому первый вызов echo печати 9 .

Поведение третьей линии зависит от оболочки. Некоторые оболочки (например, тире) жалуются, что a не содержит действительного числового значения. Другие оболочки (например, ksh, bash, zsh) обрабатывают значение a как подвыражение, которое оценивается для получения значения для использования в основном выражении. То есть в этих других оболочках значение a оценивается до 3 , а арифметическое выражение вычисляет 3 × 4, поэтому результат равен 12.

Наконец, $[…] является устаревшим, нестандартным вариантом $((…)) . Утилита expr представляет собой более старый способ сделать арифметические вычисления в сценариях оболочки, начиная с момента, когда оболочки не имели встроенного арифметического синтаксиса. expr "$num1" + "$num2" печатает 7, как и избыточное echo `expr "$num1" + "$num2"` (вы ошибочно указали один из котировок).

  • Как выполнить скрипт при выходе из системы?
  • Каково значение «1» в ls (1)?
  • Убедитесь, что сценарий bash имеет ровно два аргумента, которые являются каталогами
  • Как построить вывод команды
  • Отслеживать определенные параметры для некоторой команды
  • Последствия безопасности использования неанализированных данных в арифметической оценке оболочки
  • Цвет не удался.
  • Просмотреть команду в истории оболочки
  • Почему «$ ((~ 33))« производит -34?
  • извлекать каждый n-й символ из строки
  • Ошибка при форсировании цикла for?
  • Linux и Unix - лучшая ОС в мире.