Коли до / після збільшення змінної в POSIX Shell, яка різниця між цими двома прикладами. Здається, вони мали б однакові наслідки, але чи використовували б їх по-різному? Коли ви віддасте перевагу одне над іншим?
X=$((X+1))
: $((X=X+1))
Коли до / після збільшення змінної в POSIX Shell, яка різниця між цими двома прикладами. Здається, вони мали б однакові наслідки, але чи використовували б їх по-різному? Коли ви віддасте перевагу одне над іншим?
X=$((X+1))
: $((X=X+1))
Відповіді:
У вашому першому прикладі $((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
Це має бажані побічні ефекти, економить одну лінію та досить чітко.