При пред/пост-инкременте переменной в POSIX Shell, в чем разница между этими двумя примерами. Кажется, что они будут иметь одинаковые последствия, но будут ли они использоваться по-разному? Когда вы предпочтете один другому?
X=$((X+1))
: $((X=X+1))
решение1
В первом примере $((X+1))
вычисляется выражение X + 1 и расширяется до результата, который затем присваивается переменной.
Во втором примере $((X=X+1))
увеличивается X
на единицу ( $((X++))
также допустимо и короче, но не обязательно поддерживается оболочкой), затем расширяется до нового значения $X
, которое является первым аргументом команды null, :
. Команда null игнорирует свои аргументы, и результат отбрасывается (с побочными эффектами).
Лично я бы предпочел первую форму по трем (относительно субъективным) причинам:
- Команда null неясна и неправильно понимается, о чем свидетельствуют часто возникающие здесь запутанные вопросы.
- Первая форма кажется более естественной с точки зрения общей грамматики оболочки и даже немного напоминает старый стиль оценки.
- Первая форма более ясная и лаконичная и не содержит команды.
Вам придется использовать первую версию, если вы изменяете среду только одной команды, например
X=$((X+1)) /usr/local/bin/something
Вам придется использовать вторую форму, чтобы напрямую добавить оценку к аргументам:
ls -la "file-$((X++))" # or ...
ls -la "file-$((X=X+1))" # for better compatibility
Это дает желаемые побочные эффекты, экономит одну строку и довольно понятно.