如何在 Bash 中求幂
Posted
技术标签:
【中文标题】如何在 Bash 中求幂【英文标题】:How to do exponentiation in Bash 【发布时间】:2011-04-22 18:30:53 【问题描述】:我试过了
echo 10**2
打印10**2
。如何计算正确的结果,100?
【问题讨论】:
【参考方案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 operator 的 external 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 'BEGINprint 10^2' # POSIX standard
awk 'BEGINprint 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,都在旁边进行了描述。以上是关于如何在 Bash 中求幂的主要内容,如果未能解决你的问题,请参考以下文章