shell脚本执行数学运算

此处只是做个简单的记录。

1、使用expr命令进行简单的数学表达式运算,expr可以识别少数的数学运算符,如下所示

操作符						描述
ARG1 | ARG2 				如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2 				如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 < ARG2 				如果ARG1小于ARG2,返回1;否则返回0
ARG1 <= ARG2 				如果ARG1小于或等于ARG2,返回1;否则返回0
ARG1 = ARG2 				如果ARG1等于ARG2,返回1;否则返回0
ARG1 != ARG2 				如果ARG1不等于ARG2,返回1;否则返回0
ARG1 >= ARG2 				如果ARG1大于或等于ARG2,返回1;否则返回0
ARG1 > ARG2 				如果ARG1大于ARG2,返回1;否则返回0
ARG1 + ARG2 				返回ARG1和ARG2的算术运算和
ARG1 - ARG2 				返回ARG1和ARG2的算术运算差
ARG1 * ARG2 				返回ARG1和ARG2的算术乘积
ARG1 / ARG2 				返回ARG1被ARG2除的算术商
ARG1 % ARG2 				返回ARG1被ARG2除的算术余数
STRING : REGEXP 			如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
match STRING REGEXP 		如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
substr STRING POS LENGTH 	返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串
index STRING CHARS 			返回在STRING中找到CHARS字符串的位置;否则,返回0
length STRING 				返回字符串STRING的数值长度
+ TOKEN 					将TOKEN解释成字符串,即使是个关键字
(EXPRESSION) 				返回EXPRESSION的值

bash shell中可以这样执行数学表达式,如:$(expr var1 + var2)

例如:

cat exprtest
#!/bin/bash
# An example of using the expr command
var1=10
var2=20
var3=$(expr $var2 / $var1)
echo The result is $var3

bash shell还可以用更简单的方式来执行数学表达式,方法是:$[ operation ],美元符号加方括号将数学表达式围起来

例如:

$ cat exprtest1
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4

2、bash shell数学运算只支持整数运算,所以对需要进行浮点数运算的就有了限制。进行浮点数运算的,最常见的可用内建的bash计算器,叫做bc

在shell提示符下通过bc可以直接访问bash计算器:

# 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.11*2.84
3.15
6.38*0.29882
1.90647

运行浮点运算需要保留的小数位数是用scale控制的,例如:

# bc -q
scale=4
2.45/2
1.2250
3.22/4
.8050

在shell脚本中使用bc计算器的方法如下:

variable=$(echo “options; expression” | bc)

第一个options允许你设置变量,如果需要设置不止一个,用分号将其分开。expression参数定义了通过bc执行的数学表达式。

例如:

$ cat bctest
#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo The answer is $var1
$ cat bctest1
#!/bin/bash
var1=20
var2=3.14159
var3=$(echo "scale=4; $var1 * $var1" | bc)
var4=$(echo "scale=4; $var3 * $var2" | bc)
echo The final result is $var4

这种方法适合于较短的运算,如果需要大量运算,可以用下面的方法。bc命令可以识别输入重定向,所以可以使用内联输入重定向,允许你直接在命令行中重定向数据。在shell脚本中你可以将输出赋值给一个变量,如:

variable=$(bc << EOF

options

statements

expressions

EOF

)

例如:

$ cat bctest2
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5

3、查看退出状态码

Linux提供了一个专门的变量命令$?来保存上个已执行命令的退出状态码。必须在脚本运行完毕使用echo $?来查看。

如:

# date
Thu Sep 21 11:29:52 CST 2017
# echo $?
0

常见的几种状态码如下:

状态码			描述
0 			命令成功结束
1			一般性未知错误
2 			不适合的shell命令
126 			命令不可执行
127 			没找到命令
128 			无效的退出参数
128+x 			与Linux信号x相关的严重错误
130 			通过Ctrl+C终止的命令
255 			正常范围之外的退出状态码

4、exit命令

默认情况下,shell脚本会以最后一行命令的退出状态码退出,你可以使用exit来指定一个退出状态码,运行结束后返回自己指定的状态码。

例如:

$ cat exittest
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5

$ echo $?
5

退出状态码最大只能到255,如果超出255会出现另一种情况,例如:

$ cat exittest2
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 * $var2]
echo The value is $var3
exit $var3

$ ./exittest2
The value is 300

$ echo $?
44

此时返回44,因为退出状态码范围是0~255,这个是shell通过模运算得到的这个结果。最终的结果就是指定的数值除以256后得到的余数。