如何在Bash中进行指数运算

26

我尝试过

echo 10**2

如何计算正确结果100,使其打印出10 ** 2

3个回答

36
您可以使用 let 原生函数
let var=10**2   # sets var to 100.
echo $var       # prints 100

或者算术扩展
var=$((10**2))  # sets var to 100.

算术扩展的优点在于允许您进行shell算术运算,然后仅使用表达式而无需将其存储在变量中:
echo $((10**2)) # prints 100.

对于大数字,您可能希望使用外部命令bc指数运算符,如下所示:

bash:$ echo 2^100 | bc
1267650600228229401496703205376

如果你想将上述结果存储在一个变量中,你可以使用命令替换,可以通过$()语法来实现:
var=$(echo 2^100 | bc)

或者使用旧的反引号语法:
var=`echo 2^100 | bc`

注意,命令替换不同于算术扩展:
$(( )) # arithmetic expansion
$( )   # command substitution

3
除了使用 $((...)) 之外,也可以使用 $[...]。我认为后者在视觉上更加吸引人,但这只是我的个人口味。不知道两者之间是否有任何区别,不过它们似乎表现相同。 - DarkDust
Alberto:所有这些括号、let和$都是必需的,因为Bash作为一个简单的命令行解释器,在没有明确指示的情况下,最好假设一切都是字符串并应该被视为字符串。问候! - salezica
1
@DarkDust $[...] 是一种较旧的已弃用语法。https://unix.stackexchange.com/questions/209833/what-does-a-dollar-sign-followed-by-a-square-bracket-mean-in-bash - wisbucky
1
注意:$(( ... )) 不起作用。必须使用 $( ... )。请参见 @firefly 的 答案 - Wrichik Basu
@WrichikBasu 我提交了一份编辑; 现在已经修复了。 - Nathaniel M. Beaver

7

多种方式:

Bash

(指一种IT技术)
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) 可以工作,因为该值是在 () 内执行的命令行的结果。


这非常有帮助,你应该将其作为上面答案的评论。 - bballdave025
2
顺便说一下,其他被接受的命令都遵循$((...))模式(双括号结构,允许算术扩展和评估)。正如你所指出的,这里我们需要使用命令替换,即$(...)结构。ABS指南指出:“$(...)已经取代了反引号”。Bash初学者指南第3.4.5-6节将两者描述在一起。 - bballdave025

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接