微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BASH算术表达式

我在BASH(3.2)中使用了几种方法来做一些简单的整数运算。但是我无法确定最好的(首选)方式。
result=`expr 1 + 2`
result=$(( 1 + 2 ))
let "result = 1 + 2"

这些表达方式的根本区别是什么?
还有其他方式做同样的事情吗?

是否使用像bc这样的工具来进行浮点运算?

result=`echo "7/354" | bc`
在Bash中,允许在一行上进行多个作业:
let a=3 b=4 c=5

在您的问题中显示,引用let的参数允许您在操作符周围放置空格。但是,如果避免使用空格,则可以省略引号。

在语句开始时使用双括号的另一种形式(而不是i = $((j 1))形式)允许您在等号周围包含空格或执行后期或预增量或递减和附加分配操作:

(( a = ( b + c ) * 4 ))
(( count++ ))
(( d = --c**2 ))
(( e *= 2 ))
(( f = 3,g = 5 ))    # multiple operations require a comma separator

如果你做帮助“((”它表示双括号是“等于”让EXPRESSION“。

您可以使用declare内置函数进行赋值,包括间接的:

blue=2
name=blue
declare $name=4
echo $blue    # result: 4
echo ${!name} # result: 4

编辑:

$(())构造称为“arithmetic expansion”,并将内容评估为整数表达式。它是shell的语法元素。

如果将变量声明为整数,则不需要使用任意一种双括号,则可以从变量名称中省略美元符号(如双括号表单中所示),但不能在运算符周围添加空格:

declare -i x=1   # set integer,initialize to 1
declare +i s=1   # clear integer,initialize to 1
x+=1             # Could also be x=x+1
echo $x          # result: 2 (addition)
s+=1             # Could also be s=$s+1,requires a "$"
echo $s          # result: 11 (string concatenation)

与上述形式不同,调用expr涉及产生一个外部可执行文件,这对循环中的大量计算来说可能相当昂贵。应该使用的唯一时间是在脚本可能会进入这样一个环境的情况下shell无法做自己的算术或便携性的环境中。 POSIX shell具有算术能力,因此只能使用较旧的系统。

关于使用bc进行浮点运算,当使用Bash和许多其他shell时,需要类似的东西。 POSIX说“只需要签名的长整数算术”。

支持浮点运算的两个shell是ksh和zsh。除了bc之外,您还可以在Bash脚本中使用dc,AWK,Python,Perl等。

Bash对浮点数做的一件事是用printf内置打印(请注意,还有一个外部的printf,但是内置的优先级)。

printf "%'14.4f\n" 1234.56  # result "    1,234.5600" (in my locale)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐