let,expr和$ []之间的区别

Modified on: Sat, 09 Jun 2018 03:06:53 +0800

我想知道

之间究竟有什么区别

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

所有4分配变量a和2,但有什么区别?

从我发现到目前为止,expr是慢的,因为它不是一个真正的shell内置。但不仅仅是那个。

作者:muru,ADDB

最佳答案

所有这些都涉及算术,但是以不同的方式处理,变量是通过不同的方式创建的。其中一些特定于bash shell,而另一些则不是。

  • ((...))称为算术扩展,这是典型的bashksh shell。这允许做简单的整数算术,但没有浮点数。 ((...))只是一个动作,所以$((..))代替了操作的输出。
  • $[...]是不推荐使用的算术扩展的旧语法。 另见。这可能会保留,以便旧的bash脚本不会中断。这在ksh93中不起作用,所以我猜这个语法是特定于bash的。 注意:空格在这里非常重要;不要将$[1+1][ $a -eq $b ]之类的东西混淆。带有空格的[]称为test命令,您通常会在决策部分看到它。它的行为和目的非常不同。
  • letbashksh关键字,它允许通过简单的算术评估创建变量。如果你尝试在那里分配一个字符串,比如let a="hello world",你会得到一个语法错误。适用于bashksh93
  • $(...)是命令替换,您可以从中获取命令的输出并分配给变量。你的命令是expr,它接受位置参数,比如expr arg1 arg2 arg3,所以空格很重要。它有点像整数算术的小命令行计算器,加上一些真/假和正则表达式的东西。这是一个与shell无关的命令。

值得注意的是,算术扩展和命令替换由POSIX标准指定,而let$[...]不是。


相关问答

添加新评论