Відповіді:
Усі вони мають справу з арифметикою, але по-різному і змінна створюється різними засобами. Деякі з них характерні для bashоболонок, інші - ні.
$((...))називається арифметичним розширенням , характерним для оболонок bashі ksh. Це дозволяє робити просту арифметику з цілим числом , але жодного матеріалу з плаваючою точкою немає. Результат виразу замінює вираз, як echo $((1+1))би ставecho 2((...))позначається як арифметична оцінка і може використовуватися як частина if ((...)); thenабо while ((...)) ; doтвердження. Арифметичне розширення розширення $((..))замінює результат операції і може використовуватися для призначення змінних як у, i=$((i+1))але не може бути використане в умовних операторах.$[...] - це старий синтаксис арифметичного розширення, який застарілий. Дивіться також . Це, ймовірно, зберігається, щоб старі bashсценарії не зламалися. Це не спрацювало ksh93, тому я гадаю, що цей синтаксис є специфічним для bash. ПРИМІТКА : місця тут дуже важливі; не плутайте $[1+1]подібні речі [ $a -eq $b ]. [З пробілами відомий як testкоманда, і ви зазвичай бачите його в частині прийняття рішень. Це дуже відрізняється за поведінкою та метою.letце bashі kshключове слово , яке дозволяє змінному зі створенням простою арифметичною оцінкою. Якщо ви спробуєте призначити рядок, ніби let a="hello world"ви отримаєте синтаксичну помилку. Працює в bashі ksh93.$(...)це підміна команд, де ви буквально приймаєте висновок команди і призначаєте змінну. Ваша команда тут expr, яка займає позиційні аргументи, як-от expr arg1 arg2 arg3, тому пробіли важливі. Це щось на зразок невеликого калькулятора командного рядка для цілої арифметики, а також деяких істинних / хибних і регулярних виразів. Це команда-нейтральна оболонка.Варто також відзначити , що арифметика розширення і заміна команди визначаються стандартом POSIX , в той час як letі $[...]немає.
letКоманда виконує арифметичну оцінку і є вбудованою оболонкою.
Запустіть цю команду, і ви нічого не отримаєте (тільки оцінює):
let 1+2$(( ))використовується для виконання арифметичного розширення : читайте тут
Запустіть цю, і ви отримаєте помилку (через розширення):
$((1+2))$[ ] - це старий синтаксис для арифметичного розширення:
Старий формат $ [вираз] застарілий і буде видалений у майбутньому bash. Сторінка чоловіка Баша
expr є двійковою командою, якщо ви хочете виконати арифметичне розширення в підстановці команди, ви можете використовувати її:
echo $(expr 1 + 2)
echo `expr 1 + 2`Оскільки деякі відповіді вище конкретно згадують ksh93, варто зазначити, що він може робити математику з плаваючою комою, наприклад:
$ print $((1.0/3))
0.333333333333333333
Ви можете контролювати точність виводу за допомогою printf, наприклад:
$ printf "%.4f\n" $((1.0/3))
0.3333
Принаймні один аргумент повинен бути вказаний як число з плаваючою комою, як зазначено вище. Якщо обидва вказані як цілі числа, тоді виконується лише ціла математика, наприклад:
$ print $((1/3))
0
Це може бути корисно, коли вам потрібна математика з плаваючою комою в сценарії оболонки, оскільки ви можете уникнути виклику зовнішньої команди.
zshвідповідь . Оскільки kshі bashсхожі між собою (загалом), ніж будь-який zsh, мені здається, що kh93відповідь на це питання може бути досить корисною.
((...))насправді можна використовувати для виконання завдань уbash,kshа такожzsh:n=10; ((n+=10)); echo $nдрукує 20 та((x=1)); echo $xдрукує 1.