Почему $ ((40-35)) превращается в 5?

Какой странный синтаксис оболочки скрыт за $((40-35)) и как он вычисляет значение?

Пример:

 $> echo $((40-35)) 5 

2 Solutions collect form web for “Почему $ ((40-35)) превращается в 5?”

На странице bash :

  ((expression)) The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expres- sion is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression". 

И далее:

  Arithmetic Expansion Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is: $((expression)) 

Все, что помещается в двойные парсеры, становится математическим выражением, которое оценивает bash .

Это арифметическое расширение . Он поддерживается во всех оболочках POSIX (его не было в исходной оболочке Bourne). Синтаксис арифметического выражения в основном такой же, как на языке C.

Вы можете использовать переменные с или без $ в арифметическом выражении. Без переменной $ переменная стоит как переменная и, в частности, может быть назначена; например, echo $((a=4)) $a отпечатки 4 4 . С помощью $ оболочка выполняет простое расширение текста; например a=2+2; echo $(($a)) a=2+2; echo $(($a)) печатает 4 тогда как a=2+2; echo $((a)) a=2+2; echo $((a)) является ошибкой (но печатает 4 на некоторых оболочках).

Точные правила для определения того, является ли $(( начинается подстановка команды ( $(command) где команда начинается с открывающей скобки) или воздушное выражение ( $((expression)) ) варьируются от оболочки к оболочке. для выполнения подстановки команды, и команда начинается с ( , помещает пространство в безопасное состояние: $( (echo hello)) (такие команды встречаются редко, поэтому синтаксис можно добавить без какой-либо практической опасности путаницы).

  • Что происходит, когда вы выполняете функцию, которая вызывает другую функцию?
  • Вызов URL-адреса debian из командной оболочки
  • В каких ситуациях пользователь не позволял оболочке записывать свою команду в историю?
  • Перемещение переменной за пределами оператора case
  • Заменить переменную цикла в шаблоне строки
  • Пространства в назначениях переменных в сценариях оболочки
  • Разница между 1> и>
  • диалоговое меню для отображения файлов и выбора одного из них
  • Могу ли я сделать «Есть прекращенные рабочие места», которые сложнее убить?
  • Каков самый простой способ добавить строку в начале каждой строки файла из командной строки?
  • Как я могу заставить команду «bind» работать в sh shell
  • Interesting Posts

    GNU parted resizeepart в скрипте

    Отключить автопрокрутку в gnome 3.4

    Двойные внешние мониторы на док-станции Dell E-Port II зеркалируются друг с другом

    Команда ls – определяет количество столбцов

    Программно переключаться между ad-hoc и обычной беспроводной сетью

    Как распечатать (часть) справочную страницу?

    Как подключить исходный код функции elisp в Emacs?

    Как отключить клиентскую часть шифрования в Linux при установке доли Azure с помощью mount.cifs с помощью SMBv3?

    В чем разница между запуском программы в качестве демона и разворачиванием ее в фоновом режиме с помощью «&»?

    icmp ограничен во многих сетевых пространствах?

    Как найти все совпадения строки в каталоге?

    shell scripting – несколько тестов равенства в одном выражении if

    Лучший совет по решению для резервного копирования на NAS через WAN

    Как снова сделать взломанные файлы в репозитории Subversion?

    Адаптер Wi-Fi не найден, я все еще использую Wi-Fi. Моя настройка «Проводная» подключена, но у меня нет сетевого шнура

    Linux и Unix - лучшая ОС в мире.