【问题标题】:shell scripting arithmetic operationsshell脚本算术运算
【发布时间】:2011-03-02 00:11:25
【问题描述】:

一般来说,我会在 shell 脚本中使用 expr 来进行算术运算。

有没有一种方法可以在不使用 expr 的情况下在 shell 脚本中进行算术运算?

【问题讨论】:

  • 我想“改用bc”不是完全您正在寻找的答案...
  • @ignacio...你能举个例子来说明如何使用 bc 吗?
  • PI=$(echo "4*a(1)" | bc -l)

标签: unix shell ksh


【解决方案1】:

现代 shell(在我看来符合 POSIX = 现代)支持算术运算: + - / * 有符号长整数变量 +/- 2147483647。

将 awk 用于双精度,15 位有效数字 它也可以用于 sqrt。

使用 bc -l 将精度扩展到 20 位有效数字。

您已经看到的 shell 的语法 (zed_0xff):

a=$(( 13 * 2 ))
a=$(( $2 / 2 ))
b=$(( $a - 1 ))
a=(( $a + $b ))

awk 本机执行双精度-浮点-算术运算。 它也有 sqrt, cos, sin .... 见:

http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html

bc 有一些已定义的函数和扩展的 presision,可通过 -l 选项获得:

bc -l

示例:

echo 'sqrt(.977)' | bc -l

【讨论】:

    【解决方案2】:

    如果您使用的是 ksh,您是否尝试阅读“man ksh”?

    “man bash”,例如,有足够的关于用 bash 做算术的信息。

    命令 typeset -i 可用于指定必须将变量视为整数,例如 typeset -i MYVAR 指定变量 MYVAR 是整数而不是字符串。在 typeset 命令之后,尝试为变量分配非整数值将失败:

       $ typeset -i MYVAR
       $ MYVAR=56
       $ echo $MYVAR
       56
       $ MYVAR=fred
       ksh: fred: bad number
       $
    

    要对变量或在 shell 脚本中执行算术运算,请使用 let 命令。 let 将其参数作为简单的算术表达式求值。例如:

       $ let ans=$MYVAR+45
       echo $ans
       101
       $
    

    上面的表达式也可以写成:

       $ echo $(($MYVAR+45))
       101
       $
    

    包含在 $(( 和 )) 中的任何内容都被 Korn shell 解释为算术表达式

    【讨论】:

    【解决方案3】:

    shell 内置$(( <expr> )) 的精度和范围取决于平台。在 32 位平台上,它仅限于 32 位整数(与 expr 不同,后者似乎以一种似乎独立于平台的方式支持更大的整数)。

    (请注意,虽然^ 在大多数 shell 中是一个有效的运算符,但它并不意味着 'to the power of',而是 XOR。)

    另外 - 在这方面,一些 shell 更受欢迎。比如zsh就允许浮点运算,比如$(( 10/3.0 ))

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多