Назначение: выражение или команда?

В оболочках Bash и Posix существует множество форм команд, и присваивание - это форма команды (в частности, простой команды), если я прав.

Однако let может использоваться перед присваиванием, а let должен использоваться перед выражением. Таким образом, присваивание - это тоже выражение, если я правильно понимаю.

Какие различия между присваиванием с let и без него, оба используются как команды? Я спрашиваю в основном о различиях между их назначением, т.е. когда что использовать. Например

$ aaa=1

$ let aaa=1
-1
23.04.2016, 01:46
3 ответа

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
3
28.01.2020, 05:06

Насколько я знаю, 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.

3
28.01.2020, 05:06

Это задокументировано в документации let , прямо под тем местом, где говорится, что он принимает выражение.

let выражение [выражение…]

Встроенная функция let позволяет выполнять арифметические действия с переменными оболочки. Каждое выражение оценивается в соответствии с правилами, приведенными ниже в Арифметика оболочки . Если последнее выражение дает результат 0, let возвращает 1; в противном случае возвращается 0.

Арифметика оболочки включает операторы присваивания = , * = , / = , % = , + = , - = , << = , >> = , & = , ^ = и | = . Это, как правило, не связано с обычными операторами присваивания, которые не применяют никакой дополнительной обработки.

2
28.01.2020, 05:06

Теги

Похожие вопросы