Я хочу знать, в чем именно разница между
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Все 4 присваивают переменную a с 2, но в чем разница?
Из того, что я обнаружил до сих пор, является то, что expr медленнее, потому что это не настоящая встроенная оболочка. Но не более того.
((...))
фактически может использоваться для заданийbash
,ksh
аzsh
:n=10; ((n+=10)); echo $n
печатает 20 и((x=1)); echo $x
печатает 1.let
Команда выполняет арифметическую оценку и является встроенной в оболочку.Запустите эту команду, и вы ничего не получите (только оценки):
$(( ))
используется для выполнения арифметического расширения : читайте здесьЗапустите этот, и вы получите ошибку (из-за расширения):
$[ ]
старый синтаксис для арифметического расширения:expr
это бинарная команда, если вы хотите сделать арифметическое раскрытие в подстановке команд, вы можете использовать ее:источник
Поскольку в некоторых ответах выше конкретно упоминается
ksh93
, стоит отметить, что он может выполнять математические операции с плавающей запятой, например:Вы можете контролировать точность вывода с помощью printf, например:
Как минимум один аргумент должен быть указан как число с плавающей точкой, как указано выше. Если оба заданы как целые числа, то выполняется только целочисленная математика, например:
Это может быть полезно, когда вам нужна математика с плавающей точкой в сценарии оболочки, поскольку вы можете избежать вызова внешней команды.
источник
zsh
ответ . Посколькуksh
иbash
они больше похожи друг на друга (в целом), чем на что-либоzsh
, мне кажется, чтоkh93
основанный на этом вопрос ответ может быть весьма полезным.let
не работает в cron. Я думаю, что это связано сlet
собственной средой. Используйте,$((...))
так как это POSIX. Например,в cron приводит к «x =», но «x = 3» при запуске из оболочки.
приводит к "х = 3" во всех случаях.
источник