Пара пов'язаних з арифметикою команд, тире, оболонки POSIX, sh, збільшення


17

Коли до / після збільшення змінної в POSIX Shell, яка різниця між цими двома прикладами. Здається, вони мали б однакові наслідки, але чи використовували б їх по-різному? Коли ви віддасте перевагу одне над іншим?

X=$((X+1))

: $((X=X+1))

Відповіді:


18

У вашому першому прикладі $((X+1))оцінюється вираз X + 1 і розширюється на результат, який потім присвоюється змінній.

У другому прикладі, $((X=X+1))приріст Xна одиницю ( $((X++))також справедливо і коротше, але не обов'язково підтримується оболонкою), а потім розширюється до нового значення $X, яке є першим аргументом команди нуля, :. Команда null ігнорує свої аргументи, а результат відкидається (із побічними ефектами).

Я особисто віддав перевагу першій формі через три (відносно суб'єктивні) причини:

  • Нульова команда незрозуміла і неправильно зрозуміла, на що вказує її часто тематика, що тут стає предметом плутаних питань.
  • Перша форма здається більш природною з точки зору загальної граматики оболонок і навіть трохи нагадує старий стиль оцінювання.
  • Перша форма є більш чіткою і стислою і не передбачає команди.

Вам потрібно було б використовувати першу версію, якщо ви змінювали оточення лише однієї команди, як-от

X=$((X+1)) /usr/local/bin/something

Вам потрібно буде використовувати другу форму для додавання оцінки до аргументів безпосередньо:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

Це має бажані побічні ефекти, економить одну лінію та досить чітко.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.