ADD*_*DDB 29 command-line bash scripts
我想知道这两者之间到底有什么区别
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Run Code Online (Sandbox Code Playgroud)
所有 4 都将变量 a 赋值为 2,但有什么区别?
从我目前发现的情况来看, expr 速度较慢,因为它不是一个实际的 shell 内置函数。但仅此而已。
Ser*_*nyy 35
所有这些都涉及算术,但以不同的方式和变量是通过不同的方式创建的。其中一些是特定于bashshell 的,而另一些则不是。
$((...))称为算术展开,这是bash和ksh壳的典型特征。这允许进行简单的整数运算,但没有浮点数。表达式的结果替换了表达式,因为 inecho $((1+1))会变成echo 2((...))被称为算术评估,可以用作if ((...)); then或while ((...)) ; do语句的一部分。算术扩展$((..))替代运算的输出,可用于分配变量,如 in,i=$((i+1))但不能用于条件语句。$[...] 是已弃用的算术扩展的旧语法。另见。这可能会保留,以便旧bash脚本不会中断。这在ksh93. 注意:空格在这里非常重要;不要$[1+1]与诸如[ $a -eq $b ]. 在[与空间是被称为test命令,你通常会看到它在决策部分。它在行为和目的上非常不同。let是一个bashandksh关键字,它允许通过简单的算术评估来创建变量。如果你尝试在那里分配一个字符串,let a="hello world"你会得到一个语法错误。在bash和 中工作ksh93。$(...)是命令替换,您可以从字面上获取命令的输出并分配给变量。您在此处的命令是expr,它采用位置参数,例如expr arg1 arg2 arg3,因此空格很重要。它有点像一个用于整数运算的小型命令行计算器,加上一些真/假和正则表达式类型的东西。这是一个与 shell 无关的命令。还值得注意的是,算术扩展和命令替换由POSIX 标准指定,而let和$[...]不是。
Rav*_*ina 12
let命令执行算术评估并且是一个内置的shell。
运行这个命令,你什么也得不到(只评估):
let 1+2
Run Code Online (Sandbox Code Playgroud)$(( ))用于执行算术扩展:在此处阅读
运行这个,你会得到一个错误(因为扩展):
$((1+2))
Run Code Online (Sandbox Code Playgroud)$[ ] 是算术扩展的旧语法:
旧格式 $[expression] 已弃用,并将在即将到来的 bash 中删除。 Bash 手册页
expr 是一个二进制命令,如果你想在命令替代中进行算术扩展,你可以使用它:
echo $(expr 1 + 2)
echo `expr 1 + 2`
Run Code Online (Sandbox Code Playgroud)小智 5
由于上面的一些答案特别提到ksh93,值得注意的是它可以进行浮点数学运算,例如:
$ print $((1.0/3))
0.333333333333333333
Run Code Online (Sandbox Code Playgroud)
您可以使用 printf 控制输出的精度,例如:
$ printf "%.4f\n" $((1.0/3))
0.3333
Run Code Online (Sandbox Code Playgroud)
必须至少将一个参数指定为浮点数,如上所述。如果两者都指定为整数,则只进行整数数学运算,例如:
$ print $((1/3))
0
Run Code Online (Sandbox Code Playgroud)
当您需要在 shell 脚本中进行浮点数学运算时,这会很有帮助,因为您可以避免调用外部命令。
| 归档时间: |
|
| 查看次数: |
22937 次 |
| 最近记录: |