五、数学运算符
expr命令
对数字的基本计算做比较时,假为0,真为1,特殊符号需要转义。
只支持整数运算
注意要有空格
使用expr命令时需要加\进行转义,因为部分符号是保留关键字
例:对数字的基本计算
[root@tzPC ~]# expr 2\>5 2>5 [root@tzPC ~]# expr 2 \> 5 0 [root@tzPC ~]# expr 6 \> 5 1 [root@tzPC ~]# expr 3 \* 5 15 [root@tzPC ~]# expr 1 + 1 2
例:对字符串的运算
[root@tzPC ~]# expr length "ni hao" 6 [root@tzPC ~]# expr substr "ni hao" 2 4 #从第2个字符取4个 i ha
例:比较num1跟num2的大小
[root@localhost ~]# num1=30 [root@localhost ~]# num2=50 [root@localhost ~]# expr $num1 \> $num2 0
[root@localhost ~]# num3=`expr $num1 \> $num2`
例:脚本中使用
[root@tzPC Script]# bash test2 The result is 0 [root@tzPC Script]# cat test2 #!/bin/bash a=1 b=2 c=$(expr $a / $b) echo The result is $c
使用方括号
使用方括号不需要转义
[root@tzPC Script]# bash test3 The final result is 500 [root@tzPC Script]# cat test3 #!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo The final result is $var4
使用$(())
格式:$((表达式1,表达2))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。a++ 等价于 a=a+1
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
常用的算数运算符
运算符 |
意义 |
++ -- |
递增及递减,可前置也可以后置 |
+ - ! ~ |
一元运算的正负号 逻辑与取反 |
+ - * / % |
加减乘除与余数 |
< <= > >= |
比较大小符号 |
== != |
相等 不相等 |
>> << |
向左位移 向右位移 |
& ^ | |
位的与 位的异或 位的或 |
&& || |
逻辑与 逻辑或 |
? : |
条件判断 |
例:
[root@tzPC ~]# ((a=1+2*3-2)) [root@tzPC ~]# echo $a 5 [root@tzPC ~]# b=$((1+2)) [root@tzPC ~]# echo $b 3 [root@tzPC ~]# echo $((2*3)) 6
例:递增递减
[root@tzPC ~]# echo $b 3 [root@tzPC ~]# echo $((b++)) 3 [root@tzPC ~]# echo $b 4
说明: a++或a--为先赋值再+1或减1 ; ++a或--a为先加1或减1,然后再进行赋值
例:求1到100的和
[root@tzPC ~]# echo $((100*(1+100)/2)) 5050
练习题
要求:提示用户输入一个正整数num,计算1+2+3+…+num的值。
需要判断是否为整数
[root@localhost ~]# num1=56.1 [root@localhost ~]# expr $num1 + 1 expr: 非整数参数 [root@localhost ~]# echo $? 2
#可以看到报错,输出结果为2 [root@localhost ~]# num1=56 [root@localhost ~]# expr $num1 + 1 57 [root@localhost ~]# echo $? 0
#输出结果为0表示执行成功
答案
[root@localhost ShellScript]# cat example_4.sh #!/bin/bash while true do read -p "pls input a positive number:" num expr $num + 1 &> /dev/null if [ $? -eq 0 ];then if [ `expr $num \> 0` -eq 1 ];then for((i=1;i<=$num;i++)) do sum=`expr $sum + $i` done echo "1+2+3+...+$num=$sum" exit fi fi echo "error,input enlegal" done
浮点运算bc命令
bc是bash自带的运算器,支持浮点数运算,变量,注释(/* */),表达式,编程语句,函数。
如果不指定内建变量scale,默认还是得到的整数
自带变量scale可以设置,默认为0,也就是为整型
支持+,-,*,/,%,^运算
num1 + num2 num1 - num2 num1 * num2 num1 / num2 num1 % num2 num1 ^ num2 //指数运算
输入bc回车进入互动模式
[root@localhost ShellScript]# 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'. 5+5 10 5/3 1
scale=2 //保留小数点后两位
23/5
4.60
或者
[root@localhost ShellScript]# echo "12+45" | bc 57
通过scale设置精确度
[root@localhost ShellScript]# echo "scale=4;12.56*45.88" | bc 576.2528
在脚本中使用bc
[root@tzPC Script]# bash test4 The answer is .6880 [root@tzPC Script]# cat test4 #!/bin/bash var1=$(echo "scale=4; 3.44 / 5" | bc) echo The answer is $var1
bc可以识别内联输入
[root@tzPC Script]# bash test6 The final answer for this mess is 1578.184 [root@tzPC Script]# cat test6 #!/bin/bash var1=10.4 var2=43.21 var3=33.2 var4=34 var5=$(bc << EOF scale =4 a1 = ( $var1 * $var2) b1 = ( $var3 * $var4) a1+b1 EOF ) echo The final answer for this mess is $var5
在bash计算器中创建的变量只能在bash计算器中使用,不能在脚本中使用
简易到爆的乘法计算器
[root@localhost ShellScript]# cat bc.sh #!/bin/bash read -p "num1:" num1 read -p "num2:" num2 echo "scale=4;$num1*$num2" | bc
或者
num3=`echo "scale=4;$num1*$num2" | bc`
echo $num3
退出脚本exit
Shell中每个命令都使用退出状态码来高速shell已经运行完毕,退出状态码取值范围0~255的证书。
一个成功结束的命令的退出状态码是0。
root@tzPC Script]# echo $? 0 [root@tzPC Script]# sdfasdf bash: sdfasdf: 未找到命令 [root@tzPC Script]# echo $? 127
状态码 | 描述 |
0 | 命令成功结束 |
1 |
一般性未知错误(提供了无效参数) |
2 | 不适合的shell命令 |
126 | 命令不可执行(没有执行权限) |
127 | 没有找到命令 |
128 | 无效的退出参数 |
128+x | 与Linux信号x相关的严重错误 |
130 | 通过Ctrl+C终止的命令 |
255 | 正常范围之外的退出状态码 |
退出状态码可以指定,也可以为变量
[root@tzPC Script]# cat test3 #!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo The final result is $var4 exit 5 #或者为 exit $var4
如果退出码大于255,结果就会变为指定的数值除以256得到的余数。