shell脚本之二 数学运算
退出状态
-
在通常调用的shell脚本执行中经常会需要执行结束后提供一个返回值,这个值通常来说就是退出状态码,我们可以自定义退出状态码来表示脚本执行的不同状态
#!/bin/bash #退出状态码,最大为255,超过则进行模运算 #测试退出状态码 echo 开始执行脚本 echo 脚本执行完毕,正在退出 exit 5
-
除了自己定义退出状态码,shell中默认有一些特定意义的状态码,比如正常执行状态是0,异常退出状态是1等。
退出码的值 含义 例子 注释 1 通用错误 let “var1 = 1/0” 各种各样的错误都可能使用这个退出码, 比如"除0错误" 2 shell内建命令使用错误(Bash文档上有说明) 很少看到, 通常情况下退出码都为1 126 命令调用不能执行 程序或命令的权限是不可执行的 127 未知命令 估计是$PATH不对, 或者是命令拼写错误 128 exit的参数错误 exit 3.14159 exit只能以整数作为参数, 范围是0 - 255(见脚注) 128+n 信号"n"的致命错误 kill -9 脚本的$PPID $? 返回137(128 + 9) 130 用Control-C来结束脚本 Control-C是信号2的致命错误, (130 = 128 + 2, 见上边)
shell数学运算
- shell也可以用来计算数学运算,但对应的组件各有利弊
expr命令
- expr命令的英文全称是“expression”,即是表达式的意思,作用是一个命令行的计数器,常用于在UNIX/LINUX系统中求表达式变量的值,一般用于整数值,也可用于字符串。
- 语法格式: expr arg1 运算符 arg2
#计算数值 [root@dsj-1 test]# expr 14 % 9 5 [root@dsj-1 test]# expr 10 + 10 20 [root@dsj-1 test]# expr 30 / 3 / 2 5 [root@dsj-1 test]# expr 30 * 3 90 #计算字符串长度 [root@dsj-1 test]# expr length "this is a test" 14 #抓取字串 [root@dsj-1 test]# expr substr "this is a test" 3 5 is is #获取下标 [root@dsj-1 test]# expr index "sarasara" a 2
使用方括号执行运算
-
将数学表达式放在$[]中,bash便不会将其识别为特殊符号。
#!/bin/bash var1=10 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo 'The final result is '$var4
-
但是它只支持整数运算,使用浮点数会报错
使用bc计算器
-
bc命令来自于英文词组“Binary Calculator”的缩写,中文译为二进制计算器,其功能是用于数字计算。Bash解释器仅能够进行整数计算,而不支持浮点运算,因此有时要用到bc命令进行高精度的数字计算工作。
-
bc使用
直接输入bc执行即可进入bc计算器命令行界面[root@dsj-1 test]# 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.235*3 3.705 #设定计算精度为小数点后3位,取浮点数除法结果 scale=3 3/8 .375 分别计算整数的平方与平方根 8^2 64 sqrt(100) 10.000 quit [root@dsj-1 test]#
-
脚本里使用bc计算
利用管道符 | 将表达式传送给bc,并将计算结果赋值给变量#!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=$(echo "scale=2; $var1*$var2+$var3*$var4" | bc) echo The final answer is $var5
使用内联重定向
- 对于复杂运算,可以使用内联输入重定向,直接在命令行中重定向数据
- 格式
var=$(bc << EOF options statements expression EOF )
- 样例
#!/bin/bash var1=10.45 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