В оболочках Bash и Posix существует множество форм команд, и присваивание - это форма команды (в частности, простой команды), если я прав.
Однако let
может использоваться перед присваиванием, а let
должен использоваться перед выражением. Таким образом, присваивание - это тоже выражение, если я правильно понимаю.
Какие различия между присваиванием с let
и без него, оба используются как команды? Я спрашиваю в основном о различиях между их назначением, т.е. когда что использовать.
Например
$ aaa=1
$ let aaa=1
let
, хотя сам не POSIX-совместим, может быть выражен в соответствии с POSIX как
[ "$(( <EXPRESSION> ))" -ne 0 ]
В отличие от простого присваивания, let
также оценивает присвоение (выражение) и возвращает код выхода в зависимости от результата:
$ aaa=1; echo $?
0
$ aaa=0; echo $?
0
$ let aaa=1; echo $?
0
$ let aaa=0; echo $?
1
Насколько я знаю, let
не совместим с POSIX . ShellCheck соглашается:
$ cat test.sh
#!/bin/sh
let a=3
$ shellcheck test.sh
In test.sh line 2:
let a=3
^-- SC2039: In POSIX sh, 'let' is undefined.
На странице руководства bash говорится:
((выражение))
Выражение вычисляется в соответствии с правилами, описанными ниже в разделе АРИФМЕТИЧЕСКАЯ ОЦЕНКА. Если значение выражения не равно нулю, статус возврата - 0; в противном случае статус return равен 1. Это в точности эквивалентно let "выражение".
и
АРИФМЕТИЧЕСКАЯ ОЦЕНКА
Оболочка позволяет вычислять арифметические выражения при определенных обстоятельствах (см. Let и объявляйте встроенные команды и арифметическое расширение). Оценка выполняется целыми числами фиксированной ширины без проверки переполнения, хотя деление на 0 фиксируется и помечается как ошибка. Операторы , их приоритет, ассоциативность и значения такие же, как в языке C. Следующий список операторов сгруппирован по уровням операторов с равным приоритетом. Уровни перечислены в порядке убывания приоритета.
…
= * = / =% = + = - = << = >> = & = ^ = | =
присваивание
и
пусть arg [arg ...]
Каждый аргумент является вычисляемым арифметическим выражением (см. АРИФМЕТИЧЕСКАЯ ОЦЕНКА выше). Если последний аргумент равен 0, let возвращает 1; В противном случае возвращается 0.
Итак, в bash присваивание также является выражением, и поскольку вы можете вычислить одно или несколько выражений с помощью let
, вы можете выполнить одно или несколько присваиваний с помощью одного let
. Но, как отмечалось выше, он не будет совместим с POSIX.
Это задокументировано в документации let
, прямо под тем местом, где говорится, что он принимает выражение.
Встроенная функция let позволяет выполнять арифметические действия с переменными оболочки. Каждое выражение оценивается в соответствии с правилами, приведенными ниже в Арифметика оболочки . Если последнее выражение дает результат 0, let возвращает 1; в противном случае возвращается 0.
Арифметика оболочки включает операторы присваивания =
, * =
, / =
, % =
, + =
, - =
, << =
, >> =
, & =
, ^ =
и | =
. Это, как правило, не связано с обычными операторами присваивания, которые не применяют никакой дополнительной обработки.