Пара команд, связанных с арифметикой, Dash, POSIX shell, sh, Increment

Пара команд, связанных с арифметикой, Dash, POSIX shell, sh, Increment

При пред/пост-инкременте переменной в 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

Это дает желаемые побочные эффекты, экономит одну строку и довольно понятно.

Связанный контент