Bash let
— это встроенная команда в системах Linux, используемая для вычисления арифметических выражений переменных оболочки.
В отличие от других арифметических вычислений и команд расширения, let
— простая команда со своей собственной средой, допускающая также арифметическое расширение.
Содержание
Особенности
Утилита выполняет расчёт всех аргументов в математическом выражении. Расчёт выполняется для целых чисел фиксированной ширины без проверки на переполнение. Однако деление на 0 перехватывается и выдаётся ошибка.
В выражении с командой let
можно использовать операторы сложения +
, вычитания -
, умножения *
, деления /
и модуля %
.
В качестве операндов можно использовать переменные командного процессора. Название переменной заменяется её значением (приводится к целому числу фиксированной ширины) в выражении. У переменной не должен быть включён атрибут integer, чтобы её можно было использовать в выражении.
Операторы вычисляются в порядке старшинства. Вложенные выражения в скобках вычисляются первыми и могут переопределить указанные выше правила старшинства.
Состояние выхода:
Если последний АРГУМЕНТ имеет значение 0, то команда возвращает 1. В противном случае она возвращает 0.
Синтаксис
let аргумент [аргумент ...]
Параметры
Указанные ниже операторы объединены в группы с одинаковым приоритетом. Группы перечислены в порядке уменьшения приоритета.
- id++, id--
- Последующее увеличение и уменьшение переменной
- ++id, --id
- Предварительное увеличение и уменьшение переменной
- -, +
- Унарный минус и плюс
- !, ~
- Логическое и побитовое отрицание
- **
- Возведение в степень
- *, /, %
- Умножение, деление, остаток
- +, -
- Сложение, вычитание
- <<, >>
- Битовые сдвиги влево или вправо
- <=, >=, <, >
- Сравнение
- ==, !=
- Равенство, неравенство
- &
- Побитовое И (AND)
- ^
- Побитовое исключающее ИЛИ (XOR)
- |
- Побитовое ИЛИ (OR)
- &&
- Логическое И (AND)
- ||
- Логические ИЛИ (OR)выражение ? выражение : выражение
- Условный оператор
- =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
- Присвоение
Использование команды let в Linux
Присвоение значения переменной
Присваиваем значение переменной с помощью следующей команды:
$ let "[variable] = [value]"
Например, присваиваем значение 4 переменной var1
и распечатываем значение в качестве вывода:
oleg@mobile:~:$ let "var1 = 4"; echo $var1
4
oleg@mobile:~:$
Аналогично, после установки значения переменной команда позволяет нам присвоить такое же значение другой переменной:
oleg@mobile:~:$ let "var1 = 4" "var2=var1"; echo $var2
4
oleg@mobile:~:$
Основные арифметические операции
После установки значений переменных используем команду для выполнения основных арифметических операций. Например, установливаем var1
как 4 и var2
как 2 и выполняем несколько операций.
Сложение:
oleg@mobile:~:$ let "var1 = 4" "var2 = 2" "var3=var1+var2"; echo $var3
6
oleg@mobile:~:$
Вычитание:
oleg@mobile:~:$ let "var1 = 4" "var2 = 2" "var3=var1-var2"; echo $var3
2
oleg@mobile:~:$
Умножение:
oleg@mobile:~:$ let "var1 = 4" "var2 = 2" "var3=var1*var2"; echo $var3
8
oleg@mobile:~:$
Деление:
oleg@mobile:~:$ let "var1 = 4" "var2 = 2" "var3=var1/var2"; echo $var3
2
oleg@mobile:~:$
Модуль:
oleg@mobile:~:$ let "var1 = 4" "var2 = 2" "var3=var1%var2"; echo $var3
0
oleg@mobile:~:$
В этих примерах команда устанавливает значение var3
как результат арифметической операции и распечатывает результат.
Возведение в степень
Команде требуются два целых числа для возведения в степень. Первое значение (base) возводится в степень второго значения (power):
$ let "[base] ** [power]"
Например, чтобы возвести базовое значение 4 в степень 2 и распечатать результат, используется следующая команда:
oleg@mobile:~:$ let "var1 = 4 ** 2"; echo $var1
16
oleg@mobile:~:$
Унарные операции
Используем унарный минус с командой let
, чтобы изменить выражение с положительного на отрицательное и наоборот:
oleg@mobile:~:$ let "var1 = 2 + 3" "var1=-var1"; echo $var1
-5
oleg@mobile:~:$
Унарный плюс умножает выражение на 1 и возвращает неизменное значение:
oleg@mobile:~:$ let "var1 = 2 + 3" "var1=+var1"; echo $var1
5
oleg@mobile:~:$
Изменение значения переменной
Использование операторов постинкремента или постдекремента интерпретирует значение переменной, а затем увеличивает или уменьшает его на 1:
oleg@mobile:~:$ let "var1 = 10" "var2=var1++"; echo $var1 $var2
11 10
oleg@mobile:~:$
В приведённом выше примере переменная var2
получает значение var1
(10) до того, как оно увеличивается на 1. То же самое происходит при выполнении постдекремента:
oleg@mobile:~:$ let "var1 = 10" "var2=var1--"; echo $var1 $var2
9 10
oleg@mobile:~:$
Выполнение предварительного приращения увеличивает значение var1
на 1 (11), затем присваивает новое значение var2
:
oleg@mobile:~:$ let "var1 = 10" "var2=++var1"; echo $var1 $var2
11 11
oleg@mobile:~:$
Выполнение предварительного декремента делает то же самое. Однако на этот раз он уменьшает значение var1
на 1 (9):
oleg@mobile:~:$ let "var1 = 10" "var2=--var1"; echo $var1 $var2
9 9
oleg@mobile:~:$
Битовые сдвиги
Выполнение битовых сдвигов с помощью команды let
сдвигает порядок цифр в двоичном числе влево или вправо. Например, двухкратный сдвиг числа 4 влево дважды умножает его на 2:
oleg@mobile:~:$ let "var1 = 4 << 2"; echo $var1
16
oleg@mobile:~:$
Двухкратный сдвиг вправо дважды делит значение на 2:
oleg@mobile:~:$ let "var1 = 4 >> 2"; echo $var1
1
oleg@mobile:~:$
Побитовые операции
Побитовое отрицание переворачивает каждую цифру двоичного числа. Эта операция изменяет 1 на 0 и наоборот:
oleg@mobile:~:$ let "var1 = 4" "var2=~var1"; echo $var2
-5
oleg@mobile:~:$
В приведённом примере команда let
преобразовала значение 4 в 32-разрядное целое число и поменяла местами цифры. Результатом операции явилось -5.
Побитовый оператор AND преобразует пару значений в 32-разрядные целые числа со знаком и сравнивает цифры по порядку. Действие возвращает 1, если обе цифры равны 1, иначе возвращает 0:
oleg@mobile:~:$ let "var1 = 4" "var2 = 8" "var3 = var1&var2"; echo $var3
0
oleg@mobile:~:$
Побитовый оператор OR сравнивает соответствующие цифры двух значений и возвращает 1. Но хотя бы один из битов должен быть равен 1:
oleg@mobile:~:$ let "var1 = 4" "var2 = 8" "var3 = var1|var2"; echo $var3
12
oleg@mobile:~:$
Побитовый оператор XOR сравнивает соответствующие цифры двух значений и возвращает 0, если цифры совпадают. В противном случае оператор возвращает 1:
oleg@mobile:~:$ let "var1 = 4" "var2 = 8" "var3 = var1^var2"; echo $var3
12
oleg@mobile:~:$
Заключение
После внимательного прочтения данной статьи вы сможете использовать в Linux команду let
для вычисления арифметических выражений в оболочке Bash.