【问题标题】:How to do exponentiation in Bash如何在 Bash 中求幂
【发布时间】:2011-04-22 18:30:53
【问题描述】:

我试过了

echo 10**2

打印10**2。如何计算正确的结果,100?

【问题讨论】:

    标签: bash syntax operators


    【解决方案1】:

    您可以使用let builtin:

    let var=10**2   # sets var to 100.
    echo $var       # prints 100
    

    arithmetic expansion:

    var=$((10**2))  # sets var to 100.
    

    算术扩展的优点是允许您执行shell arithmetic,然后只使用表达式而不将其存储在变量中:

    echo $((10**2)) # prints 100.
    

    对于较大的数字,您可能希望将 exponentiation operatorexternal command bc 用作:

    bash:$ echo 2^100 | bc
    1267650600228229401496703205376
    

    如果您想将上述结果存储在一个变量中,您可以通过$() 语法使用command substitution

    var=$(echo 2^100 | bc)
    

    或旧的反引号语法:

    var=`echo 2^100 | bc`
    

    请注意,命令替换与算术扩展不同:

    $(( )) # arithmetic expansion
    $( )   # command substitution
    

    【讨论】:

    • 也可以使用$[ ... ] 代替$(( ... ))。我发现后者在视觉上更吸引人,但这只是我的口味。不过不知道这两者有没有区别。看起来他们的行为是一样的。
    • Alberto:所有这些括号、let 和 $ 都是必需的,因为 bash 作为一个简单的命令行解释器,最好假设所有内容都是字符串并且应该这样处理,除非另有明确说明。致敬!
    • @DarkDust $[...] 是一种较旧的已弃用语法。 unix.stackexchange.com/questions/209833/…
    • 注意: $(( ... )) 不起作用。相反,必须使用$( ... )。请参阅下面的@firefly 的answer
    • @WrichikBasu 我提交了编辑;现在已经修好了。
    【解决方案2】:

    各种方式:

    Bash

    echo $((10**2))
    

    Awk

    awk 'BEGIN{print 10^2}'  # POSIX standard
    awk 'BEGIN{print 10**2}' # GNU awk extension
    

    bc

    echo '10 ^ 2' | bc
    

    dc

    dc -e '10 2 ^ p'
    

    【讨论】:

      【解决方案3】:

      实际上 var=$((echo 2^100 | bc)) 不起作用 - bash 正在尝试在 (()) 中进行数学运算。但是一个 而是有命令行序列,因此会产生错误

      var=$(echo 2^100 | bc) 的作用是值是在里面执行的命令行的结果 ()

      【讨论】:

      • 这很有帮助你应该把它作为对上面答案的评论。
      • 不错,顺便说一句;另一个接受的命令遵循$((...)) 模式(Double Parentheses Construct,来源 Advanced Bash-Scripting Guide,“允许算术扩展和评估”)。在这里,正如您所指出的,我们需要命令替换,即 $(...) 构造。 ABS 指南notes,“$(...) 已取代反引号”。 Bash 初学者指南,section 3.4.5-6,都在旁边进行了描述。
      猜你喜欢
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2011-12-31
      • 1970-01-01
      • 2014-08-19
      相关资源
      最近更新 更多