Write by lyc at 2018-10-18 Update by lyc at 2021-3-17:整理自己早期的word版本到markdown
shell变量的数值计算 1.shell中常见的算术运算符号
shell算术运算符
说明
+
-
*
/
%
**
加,减,乘,除,取余(取模),幂运算
++
--
自增自减,可前置也可放在变量结尾
!
&&
||
逻辑非(取反)、逻辑与(and)、逻辑或(or)
<
<=
>
>=
比较符号(小于、小于等于、大于、大于等于)
==
!=
=
比较符号(相等、不等,对于字符串“=”也可以表示相当于)*
<<
>>
向左移位、向右移位
~
|
&
^
按位取反、按位异或、按位与、按位或
=
+=
-=
\*=
/=
%=
赋值运算符
例:shell算术运算符号计算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 $ cat test.sh #!/bin/sh a=$1 b=$2 [ $# -ne 2 ] && { echo "ERROR:Please enter 2 args" exit 1 } echo "a-b=$(($a-$b) )" echo "a+b=$(($a+$b) )" echo "a*b=$(($a*$b) )" echo "a/b=$(($a/$b) )" echo "a**b=$(($a**$b) )" echo "a%b=$(($a%$b) )" $ sh test.sh 2 2 a-b=0 a+b=4 a*b=4 a/b=1 a**b=4 a%b=0
2.shell中常见的算术运算命令
shell运算操作符与运算命令
说明
(())
用于整数运算的常用运算符,效率很高。
let
用于整数运算,类似于 (())
expr
用于整数运算,但还有很多其他的额外功能
bc
linux下的一个计算器程序(合适整数及小数运算)
$[]
用于整数运算
awk
awk
既可以用于整数运算,也可以用于小数运算
declare
定义变量值和属性,-i
参数可以用于定义整形变量
2.1 (()) 运算符 1 2 3 4 $ i=1 $ i=$((i+8 )) $ echo $i 9
2.2 let 命令 let
后面的赋值表达式可以不加 $
1 2 3 4 $ i=1 $ let i=i+8 $ echo $i 9
2.3 expr 命令 运算符及用于计算的数字左右都至少有一个空格,否则会报错。
使用乘号时,必须用反斜线屏蔽其特定含义,因为shell可能会误解星号的含义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ expr 2 + 2 4 $ expr 2 * 2 expr: 语法错误 $ expr 2 \* 2 4 $ expr 2 / 2 1 $ expr 2+ 2 expr: 语法错误 $ i=5 $ i=`expr $i + 6` $ echo $i 11 $ s1=oldboy $ expr length $s1 6 $ echo $s1 |wc -L 6 $ echo ${#s1} 6
多用系统内置命令或函数,效率高;少用管道,效率低。它们之间的执行速度会差距上百倍。
2.4 bc 命令 将 bc
作为计算器来使用
1 2 3 4 5 6 7 8 9 10 11 12 13 $ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1 1 1+1 2 2*2 4 6/3 2
将 bc
作为命令来使用
1 2 3 4 5 6 7 8 $ echo 3+5|bc 8 $ echo 3.2-3.1|bc .1 $ echo 2.2*2|bc 4.4 $ echo "scale=2;2.20*2.00" |bc 4.40
例:通过一条命令计算输出1+2+3+4+5+6+7+8+9+10=55
1 2 3 4 5 6 7 $ echo "`seq -s " +" 10`=`seq -s " +" 10|bc`" 1+2+3+4+5+6+7+8+9+10=55 $ echo "`seq -s " +" 10`=" $((`seq -s "+" 10 `)) 1+2+3+4+5+6+7+8+9+10=55
2.5 awk 命令 awk
运算很精确,可以用于整数或小数计算。
1 2 3 4 5 6 $ echo "6 2" |awk '{print $1-$2}' 4 $ echo "6.2 2.1" |awk '{print $1-$2}' 4.1 $ echo "6.2 2.1" |awk '{print $1*$2}' 13.02
2.6 $[ ] 运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ i=5 $ i=$[i+6] $ echo $i 11 $ echo $[2*3] 6 $ echo $[2**3] 8 $ echo $[3/5] 0 $ echo $[3%2] 1 $ echo $[ 5 % 3] 2