Я хочу знать, что именно представляет собой различие между
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Все 4 назначают переменную a с 2, но в чем разница?
Из того, что я узнал пока что, expr медленнее, потому что это не фактическая оболочка. Но не более того.
let 1+2
$(( )) используется для выполнения арифметического расширения: прочитайте здесь. Запустите это, и вы получите сообщение об ошибке (из-за расширения): $((1+2))
$[ ] старый синтаксис для арифметического расширения: старый формат $ [выражение] устарел и будет удален в начале bash. Bash Man Page 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
Это может быть полезно, когда вам нужна математика с плавающей запятой в сценарии оболочки, так как вы можете избежать вызова внешней команды.
let не работает в cron. Я думаю, это связано с тем, что let имеет свою собственную среду. Используйте $((...)), поскольку это POSIX. Например,
let x=1+2
echo x=$x
в cron приводит к «x =», но «x = 3» при запуске из оболочки.
x=$((1+2))
echo x=$x
приводит к «x = 3 «во всех случаях.
let 1+2
$(( )) используется для выполнения арифметического расширения: прочитайте здесь. Запустите это, и вы получите сообщение об ошибке (из-за расширения): $((1+2))
$[ ] старый синтаксис для арифметического расширения: старый формат $ [выражение] устарел и будет удален в начале bash. Bash Man Page 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
Это может быть полезно, когда вам нужна математика с плавающей запятой в сценарии оболочки, так как вы можете избежать вызова внешней команды.
let не работает в cron. Я думаю, это связано с тем, что let имеет свою собственную среду. Используйте $((...)), поскольку это POSIX. Например,
let x=1+2
echo x=$x
в cron приводит к «x =», но «x = 3» при запуске из оболочки.
x=$((1+2))
echo x=$x
приводит к «x = 3 «во всех случаях.
let 1+2
$(( )) используется для выполнения арифметического расширения: прочитайте здесь. Запустите это, и вы получите сообщение об ошибке (из-за расширения): $((1+2))
$[ ] старый синтаксис для арифметического расширения: старый формат $ [выражение] устарел и будет удален в начале bash. Bash Man Page 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
Это может быть полезно, когда вам нужна математика с плавающей запятой в сценарии оболочки, так как вы можете избежать вызова внешней команды.
let не работает в cron. Я думаю, это связано с тем, что let имеет свою собственную среду. Используйте $((...)), поскольку это POSIX. Например,
let x=1+2
echo x=$x
в cron приводит к «x =», но «x = 3» при запуске из оболочки.
x=$((1+2))
echo x=$x
приводит к «x = 3 «во всех случаях.