Почему $ ((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)) (такие команды встречаются редко, поэтому синтаксис можно добавить без какой-либо практической опасности путаницы).

  • Почему я получаю ошибку «Не могу chdir в домашний каталог»
  • bash - использовать значение переменной int для ссылки на параметр позиции в функции
  • Возможно отменена последняя команда?
  • если в переменной PATH существует 2 команды с одинаковым именем файла, которые будут выполнены?
  • Как я могу заставить bash освободить расширенную переменную скобки без имени?
  • Как поймать ошибку в сценарии linux bash?
  • Как создать несколько файлов в текущем каталоге в bash?
  • Вывод трубы из одной команды в нестандартный ввод другой команды
  • Сценарий Wrapper для отображения файлов с исходными кодами / исполняемых файлов
  • Есть ли способ отменить команду терминала?
  • разрешения при установке ssh в cygwin
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.