Shell中的算术运算(译)
算术运算
尽管Shell中的变量被缺省地看做是string
类型,而非number
,但是Shell本身仍然支持算术运算。
主要有以下5种方式。
1. declare
$ n=6/3 $ echo $n 6/3 $ declare -i n #将n声明为一个整数(integer) $ n=6/3 $ echo $n 2
2. expr
$ z=5 $ z=`expr $z+1` # 加号(+)两边要有空格 $ echo $z 5+1 $ z=`expr $z + 1` $ echo $z 6
3. let
$ let z=5 $ echo $z 5 $ let z=$z+1 $ echo $z 6 $ let z=$z + 1 # 与expr相反, 在加号(+)两边加空格会导致let报错! -bash: let: +: syntax error: operand expected (error token is "+") $let z=z+1 # 在读取变量值的时候,可以省略美元符号($) $echo $z 7
4. Bash内置运算( 双括号(()) )
$ ((e=5)) $ echo $e 5 $ (( e = e + 3 )) $ echo $e 8 $ (( e=e+4 )) # 加号(+)两边的空格可加可不加 $ echo $e 12
支持的算术运算有:
符号 | 含义 |
---|---|
+ – | 加减 |
++ — | 自增 自减 |
* / % | 乘 除 取模 |
** | 幂 |
除了支持算术运算外,还支持逻辑运算:
if (( x > y )); then echo "x > y" fi
支持的逻辑运算有:
符号 | 含义 |
---|---|
<= >= < > | 小于等于 大于等于 小于 大于 |
== != | 相等 不等 |
! | 否定 |
&& | 与 |
|| | 或 |
5. bc
bc
支持浮点运算,这在let
和(())
中是不支持的。
$let r=3.5 -bash: let: r=3.5: syntax error in expression (error token is ".5") $(( r = 3.5 )) -bash: ((: r = 3.5 : syntax error in expression (error token is ".5 ")
bc
的用法如下:
$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 3 + 2 5 obase=2 12 1100 <cntrl-d>
注意,使用ctrl + d
(EOF)可以退出bc
。
$r=3.5 $s=`echo "$r + 2.2" | bc` $echo $s 5.7 $ z=`echo "$z + 1" | bc` $ echo $z 8 $ z=`echo "$z+1" | bc` # 加号(+)两边的空格可加可不加 $ echo $z 9
数字类型的布尔表达式
有一下3种方式比较数字类型变量的大小。
1. test(即[])
符号 | 含义 | 举例 |
---|---|---|
-eq | 相等 | [ ‘1’ -eq 1 ] |
-gt | 大于 | [ 2 -gt 1 ] |
-ge | 大于等于 | [ 2 -ge 1 ] |
-lt | 小于 | [ 2 -gt 3 ] |
-le | 小于等于 | [ 2 -le ‘3’] |
-ne | 不等于 | [ $var1 -ne $var2 ] |
2. 双括号(即 (()) )
以下2个表达式是等价的。
if (( x < y )); then statements fi if [ $x -lt $y ]; then statements fi
3. bc
bc
可以用于比较浮点数的大小:当比较结果为真(true)
时,返回1
;否则返回0
。举个例子:
if [ $( echo "$t < 3.4" | bc ) -eq 1 ]; then statements fi
个人主页: http://www.lslxdx.com