【问题标题】:Multiplication on command line terminal命令行终端上的乘法
【发布时间】:2012-06-14 19:18:09
【问题描述】:

我正在使用串行终端为我们的实验室实验提供输入。我发现使用

$ echo "5X5"

只返回一个"5X5" 的字符串。有没有执行乘法运算的命令?

【问题讨论】:

    标签: bash unix command-line


    【解决方案1】:

    是的,您可以使用bash's built-in Arithmetic Expansion $(( )) 做一些简单的数学运算

    $ echo "$((5 * 5))"
    25
    

    查看Shell Arithmetic section in the Bash Reference Manual 获取完整的运算符列表。

    为了完整起见,正如其他人指出的那样,如果您需要任意精度,bcdc 会更好。

    【讨论】:

      【解决方案2】:

      对于更高级和更精确的数学,请考虑使用 bc(1)。

      echo "3 * 2.19" | bc -l 
      6.57
      

      【讨论】:

        【解决方案3】:

        经典的解决方案是:

         expr 5 \* 5
        

        expr 仅适用于整数操作数。另一个不错的选择是:

         echo 5 5\*p | dc
        

        dc 可以用于非整数操作数。

        【讨论】:

        • dc 与浮点数一起使用。试试echo '4 k 50 7 / p' | dc。输出为7.1428k 命令设置精度。
        • @Dennis 在两种不同的 dc 实现中,我看到浮动操作无需通过k 分配即可工作。我当然记得默认精度为 0(截断为整数)。是我记错了,还是仅仅是新的实现改变了行为?
        • 这些年来我很少使用dc,因为我更喜欢代数,更少 RPN,所以我不记得了。在我使用的 GNU 系统上,默认值为 0。旧的 (1993) FreeBSD man page 提到默认值为 0,但旧的 BSD man pages 没有。
        • 顺便说一下(对于未来的读者),为了准确地反驳断言,我的示例应该显示非整数 操作数 而不是仅显示非整数结果。不要害怕,echo '4 k 50.5 7 / p' | dc 有效(输出:7.2142)。
        【解决方案4】:

        内部方法

        Bash 支持 arithmetic expansion$(( expression ))。例如:

        $ echo $(( 5 * 5 ))
        25
        

        外部方法

        许多实用程序提供算术,包括 bcexpr

        $ echo '5 * 5' | /usr/bin/bc
        25
        
        $ /usr/bin/expr 5 \* 5
        25
        

        【讨论】:

          【解决方案5】:

          我使用这个函数,它使用bc,因此支持浮点计算:

          c () { 
              local a
              (( $# > 0 )) && a="$@" || read -r -p "calc: " a
              bc -l <<< "$a"
          }
          

          例子:

          $ c '5*5'
          25
          $ c 5/5
          1.00000000000000000000
          $ c 3.4/7.9
          .43037974683544303797
          

          Bash 的算术扩展不支持浮点数(但 Korn shell 和 zsh 支持)。

          例子:

          $ ksh -c 'echo "$((3.0 / 4))"'
          0.75
          

          【讨论】:

            【解决方案6】:

            一个简单的 shell 函数(不需要 sed)应该可以解释 '5X5'

            $ function calc { bc -l <<< ${@//[xX]/*}; };
            $ calc 5X5
            25
            $ calc 5x5
            25
            $ calc '5*5'
            25
            

            【讨论】:

              【解决方案7】:

              如果你喜欢 python 并且可以选择安装一个包,你可以使用我制作的这个utility

              # install pythonp
              python -m pip install pythonp
              
              pythonp "5*5"
              25
              
              pythonp "1 / (1+math.exp(0.5))"
              0.3775406687981454
              
              # define a custom function and pass it to another higher-order function
              pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
              3628800
              

              【讨论】:

                【解决方案8】:

                我有一个简单的脚本用于此目的:

                me@mycomputer:~$ cat /usr/local/bin/c

                #!/bin/sh
                
                echo "$*" | sed 's/x/\*/g' | bc -l
                

                它将x 更改为*,因为* 是shell 中的一个特殊字符。按如下方式使用:

                • c 5x5
                • c 5-4.2 + 1
                • c '(5 + 5) * 30'(如果表达式包含任何括号,您仍然必须使用引号)。

                【讨论】:

                • 我喜欢你使用“x”进行乘法的想法。您可以类似地使用方括号而不是括号来避免引用。 tr 可用于对多个字符进行字符映射。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-12-22
                • 1970-01-01
                • 1970-01-01
                • 2019-03-15
                • 1970-01-01
                • 2016-04-05
                • 2019-02-13
                相关资源
                最近更新 更多