使用 expr, $(()), (())

Str*_*ger 11 bash shell-script expr

在 shell 脚本中,我们可以expr $a*$b$(($a+$b)).

但为什么不只是 with (($a+$b)),因为在任何资源中,它(())都是为整数计算而编写的。

所以我们$(())在有变量而不是整数值时使用,是吗?$(())当变量可以接收浮点值时,我们应该使用什么来代替?

Joh*_*024 21

  1. 对于算术,expr是古老的。不要使用它。*

  2. $((...))并且((...))非常相似。两者都只做整数计算。区别在于$((...))返回计算结果和((...))不返回 。因此$((...))echo语句中很有用:

    $ a=2; b=3; echo $((a*b))
    6
    
    Run Code Online (Sandbox Code Playgroud)

    ((...)) 当您想分配变量或设置退出代码时很有用:

    $ a=3; b=3; ((a==b)) && echo yes
    yes
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果要进行浮点计算,请使用bcawk

    $ echo '4.7/3.14' | bc -l
    1.49681528662420382165
    
    $ awk 'BEGIN{print 4.7/3.14}'
    1.49682
    
    Run Code Online (Sandbox Code Playgroud)

*expr顺便说一句,当 glob 不够好并且需要 POSIX 方法来处理正则表达式时,它对于字符串处理仍然很有用。

  • @Stranger `expr STRING : REGEX` 的许多用途可以写成 `case STRING in PATTERN)`。`expr` 仅在 REGEX 不能用 shell 通配符表示时才有用。 (5认同)