Арифметические вычисления в оболочке
Оболочка позволяет вычислять арифметические выражения в рамках одного из видов подстановки оболочки или с помощью составной команды ((, встроенных команд let и declare, арифметической команды for, условной команды [[ или параметра -i встроенной команды declare.
Вычисления выполняются с использованием целых чисел фиксированной ширины максимально доступного размера без проверки на переполнение, однако деление на 0 перехватывается и отмечается как ошибка. Операторы, их приоритет, ассоциативность и значения совпадают с таковыми в языке C. Следующий список операторов сгруппирован по уровням операторов с одинаковым приоритетом. Уровни перечислены в порядке убывания приоритета.
-
id++ id---
постинкремент и постдекремент переменной
++id --id-
преинкремент и предекремент переменной
- +-
унарные минус и плюс
! ~-
логическое и побитовое отрицание
**-
возведение в степень
* / %-
умножение, деление, остаток от деления
+ --
сложение, вычитание
<< >>-
побитовые сдвиги влево и вправо
<= >= < >-
сравнение
== !=-
равенство и неравенство
&-
побитовое И
^-
побитовое исключающее ИЛИ
|-
побитовое ИЛИ
&&-
логическое И
||-
логическое ИЛИ
expr ? if-true-expr : if-false-expr-
условный оператор
= *= /= %= += -= <<= >>= &= ^= |=-
присваивание
expr1 , expr2запятая
Переменные оболочки можно использовать в качестве операндов; перед вычислением выражения выполняется подстановка параметров. Внутри выражения на переменные оболочки также можно ссылаться по имени без использования синтаксиса подстановки параметров. Это означает, что в арифметическом выражении можно использовать x, где x — имя переменной оболочки, и оболочка вычислит её значение как выражение и использует результат. Переменная оболочки, значение которой пусто или не задано, при обращении по имени в выражении принимает значение 0.
Значение переменной вычисляется как арифметическое выражение при обращении к ней или при присваивании значения переменной, которой был задан атрибут integer с помощью ‘declare -i’. Пустое значение принимает значение 0. Чтобы использовать переменную оболочки в выражении, не требуется включать её атрибут integer.
Целочисленные константы соответствуют определению языка C, без суффиксов и символьных констант. Константы с начальным 0 интерпретируются как восьмеричные числа. Начальное ‘0x’ или ‘0X’ обозначает шестнадцатеричное число. В остальных случаях числа имеют вид [base#]n, где необязательное значение base — десятичное число от 2 до 64, задающее основание системы счисления, а n — число в этой системе счисления. Если base# не указано, используется основание 10. При указании n, если требуется символ, не являющийся цифрой, значения больше 9 обозначаются строчными буквами, прописными буквами, ‘@’ и ‘_’ именно в таком порядке. Если значение base меньше или равно 36, строчные и прописные буквы можно использовать взаимозаменяемо для обозначения чисел от 10 до 35.
Операторы вычисляются в порядке приоритета. Подвыражения в скобках вычисляются первыми и могут переопределять описанные выше правила приоритета.
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html