Разница между let, expr и $ []

Я хочу знать, что именно представляет собой различие между

a=$[1+1] a=$((1+1)) let a=1+1 a=$(expr 1 + 1 )

Все 4 назначают переменную a с 2, но в чем разница?

Из того, что я узнал пока что, expr медленнее, потому что это не фактическая оболочка. Но не более того.

17
задан 24 July 2017 в 19:34

9 ответов

Команда let выполняет арифметическую оценку и является встроенной оболочкой. Запустите эту команду, и вы ничего не получите (оцениваете только):
let 1+2
$(( )) используется для выполнения арифметического расширения: прочитайте здесь. Запустите это, и вы получите сообщение об ошибке (из-за расширения):
$((1+2))
$[ ] старый синтаксис для арифметического расширения: старый формат $ [выражение] устарел и будет удален в начале bash. Bash Man Page expr - это двоичная команда, если вы хотите сделать арифметическое расширение внутри командной подсекции, вы можете использовать ее:
echo $(expr 1 + 2) 
echo `expr 1 + 2`
10
ответ дан 22 May 2018 в 20:14

Поскольку некоторые из вышеперечисленных ответов особенно указывают на ksh93, стоит отметить, что он может выполнять математику с плавающей запятой, например:

$ print $((1.0/3)) 
0.333333333333333333

Вы можете контролировать точность вывода с помощью printf, например:

$ printf "%.4f\n" $((1.0/3))
0.3333

Как минимум один аргумент должен быть указан как число с плавающей запятой, как указано выше. Если оба они указаны как целые числа, то выполняется только целая математика, например:

$ print $((1/3))  
0

Это может быть полезно, когда вам нужна математика с плавающей запятой в сценарии оболочки, так как вы можете избежать вызова внешней команды.

3
ответ дан 22 May 2018 в 20:14

let не работает в cron. Я думаю, это связано с тем, что let имеет свою собственную среду. Используйте $((...)), поскольку это POSIX. Например,

let x=1+2
echo x=$x

в cron приводит к «x =», но «x = 3» при запуске из оболочки.

x=$((1+2))
echo x=$x

приводит к «x = 3 «во всех случаях.

0
ответ дан 22 May 2018 в 20:14
Команда let выполняет арифметическую оценку и является встроенной оболочкой. Запустите эту команду, и вы ничего не получите (оцениваете только): let 1+2 $(( )) используется для выполнения арифметического расширения: прочитайте здесь. Запустите это, и вы получите сообщение об ошибке (из-за расширения): $((1+2)) $[ ] старый синтаксис для арифметического расширения: старый формат $ [выражение] устарел и будет удален в начале bash. Bash Man Page expr - это двоичная команда, если вы хотите сделать арифметическое расширение внутри командной подсекции, вы можете использовать ее: echo $(expr 1 + 2) echo `expr 1 + 2`
10
ответ дан 18 July 2018 в 09:46

Поскольку некоторые из вышеперечисленных ответов особенно указывают на ksh93, стоит отметить, что он может выполнять математику с плавающей запятой, например:

$ print $((1.0/3)) 0.333333333333333333

Вы можете контролировать точность вывода с помощью printf, например:

$ printf "%.4f\n" $((1.0/3)) 0.3333

Как минимум один аргумент должен быть указан как число с плавающей запятой, как указано выше. Если оба они указаны как целые числа, то выполняется только целая математика, например:

$ print $((1/3)) 0

Это может быть полезно, когда вам нужна математика с плавающей запятой в сценарии оболочки, так как вы можете избежать вызова внешней команды.

3
ответ дан 18 July 2018 в 09:46

let не работает в cron. Я думаю, это связано с тем, что let имеет свою собственную среду. Используйте $((...)), поскольку это POSIX. Например,

let x=1+2 echo x=$x

в cron приводит к «x =», но «x = 3» при запуске из оболочки.

x=$((1+2)) echo x=$x

приводит к «x = 3 «во всех случаях.

0
ответ дан 18 July 2018 в 09:46
Команда let выполняет арифметическую оценку и является встроенной оболочкой. Запустите эту команду, и вы ничего не получите (оцениваете только): let 1+2 $(( )) используется для выполнения арифметического расширения: прочитайте здесь. Запустите это, и вы получите сообщение об ошибке (из-за расширения): $((1+2)) $[ ] старый синтаксис для арифметического расширения: старый формат $ [выражение] устарел и будет удален в начале bash. Bash Man Page expr - это двоичная команда, если вы хотите сделать арифметическое расширение внутри командной подсекции, вы можете использовать ее: echo $(expr 1 + 2) echo `expr 1 + 2`
10
ответ дан 24 July 2018 в 19:25

Поскольку некоторые из вышеперечисленных ответов особенно указывают на ksh93, стоит отметить, что он может выполнять математику с плавающей запятой, например:

$ print $((1.0/3)) 0.333333333333333333

Вы можете контролировать точность вывода с помощью printf, например:

$ printf "%.4f\n" $((1.0/3)) 0.3333

Как минимум один аргумент должен быть указан как число с плавающей запятой, как указано выше. Если оба они указаны как целые числа, то выполняется только целая математика, например:

$ print $((1/3)) 0

Это может быть полезно, когда вам нужна математика с плавающей запятой в сценарии оболочки, так как вы можете избежать вызова внешней команды.

3
ответ дан 24 July 2018 в 19:25

let не работает в cron. Я думаю, это связано с тем, что let имеет свою собственную среду. Используйте $((...)), поскольку это POSIX. Например,

let x=1+2 echo x=$x

в cron приводит к «x =», но «x = 3» при запуске из оболочки.

x=$((1+2)) echo x=$x

приводит к «x = 3 «во всех случаях.

0
ответ дан 24 July 2018 в 19:25

Другие вопросы по тегам:

Похожие вопросы: