【发布时间】:2011-04-22 18:30:53
【问题描述】:
我试过了
echo 10**2
打印10**2。如何计算正确的结果,100?
【问题讨论】:
我试过了
echo 10**2
打印10**2。如何计算正确的结果,100?
【问题讨论】:
您可以使用let builtin:
let var=10**2 # sets var to 100.
echo $var # prints 100
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
【讨论】:
$[ ... ] 代替$(( ... ))。我发现后者在视觉上更吸引人,但这只是我的口味。不过不知道这两者有没有区别。看起来他们的行为是一样的。
$[...] 是一种较旧的已弃用语法。 unix.stackexchange.com/questions/209833/…
$(( ... )) 不起作用。相反,必须使用$( ... )。请参阅下面的@firefly 的answer。
实际上 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,都在旁边进行了描述。