算术运算
尽管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