shell编程系列5--数学运算
方法1 expr $num1 operator $num2
方法2 $(($num1 operator $num2))
expr操作符对照表1

操作符        含义
num1 | num2    num1不为空且非0,返回num1;否则返回num2
num1 & num2    num1不为空且非0,返回num1;否则返回0
num1 < num2    num1小于num2,返回1;否则返回0
num1 <= num2    num1小于等于num2,返回1;否则返回0
num1 = num2    num1等于num2,返回1;否则返回0
num1 != num2    num1不等于num2,返回1;否则返回0
num1 > num2    num1大于num2,返回1;否则返回0
num1 >= num2    num1大于等于num2,返回1;否则返回0
expr操作符对照表2
 操作符        含义
num1 + num2    求和
num1 - num2    求差
num1 * num2    求积
num1 / num2    求商
num1 % num2    求余数
bash数学运算之expr:
# 比较大小,只能对整数进行比较
[root@es01 ~]# num1=30
[root@es01 ~]# num2=50
# 错误:没有加空格
[root@es01 ~]# expr $num1>$num2
[root@es01 ~]# echo $?
0
[root@es01 ~]# echo $num2
50
# 错误:没有转义
[root@es01 ~]# expr $num1 > $num2
# 正确写法
[root@es01 ~]# expr $num1 \> $num2
0
[root@es01 ~]# num1=100
[root@es01 ~]# echo $num1
100
[root@es01 ~]# expr $num1 \> $num2
1
# 小于、小于等于、大于等于
[root@es01 ~]# expr $num1 \< $num2
0
[root@es01 ~]# expr $num1 \<= $num2
0
[root@es01 ~]# expr $num1 \>= $num2
1
# 运算 加、减、乘、除
[root@es01 ~]# num1=17
[root@es01 ~]# num2=5
[root@es01 ~]# expr $num1 + $num2
22
[root@es01 ~]# num3=`expr $num1 + $num2`
[root@es01 ~]# echo $num3
22
[root@es01 ~]# expr $num1 - $num2
12
[root@es01 ~]# expr $num1 \* $num2
85
[root@es01 ~]# expr $num1 / $num2
3
# 取余数
[root@es01 ~]# expr $num1 % $num2
2
# 两个小括号的计算方法,要赋值,否则会报错
[root@es01 ~]# $(($num1+$num2))
-bash: 22: command not found
[root@es01 ~]# num3=$(($num1+$num2))
[root@es01 ~]# echo $num3
22
[root@es01 ~]# num3=$(($num1*$num2))
[root@es01 ~]# echo $num3
85
[root@es01 ~]# num3=$(($num1-$num2))
[root@es01 ~]# echo $num3
12
[root@es01 ~]# num3=$(($num1/$num2))
[root@es01 ~]# echo $num3
3
# 部分支持,= 不支持
[root@es01 ~]# num3=$(($num1>$num2))
[root@es01 ~]# echo $num3
1
[root@es01 ~]# num3=$(($num1<$num2))
[root@es01 ~]# echo $num3
0
[root@es01 ~]# num3=$(($num1=$num2))
-bash: 17=5: attempted assignment to non-variable (error token is "=5")
在比较运算的时候最好使用expr
练习例子:
提示用户输入一个正整数num,然后计算1+2+3+...+num的值;必须对num是否为正整数做判断,不符合应当运行再次输入
# 判断是否大于0
[root@es01 ~]# num1=56
[root@es01 ~]# expr $num1 \> 0
1
# expr只能对整数进行计算,直接用expr 和一个整数计算获取 $? 的值来判断是否为整数
[root@es01 ~]# num1=56.58
[root@es01 ~]# expr $num1 \> 0
1
[root@es01 ~]# expr $num1 + 1
expr: non-integer argument
[root@es01 ~]# echo $?
2
[root@es01 ~]# num1=90
[root@es01 ~]# expr $num1 + 1
91
[root@es01 ~]# echo $?
0
# 具体脚本
# vim sum.sh
#!/bin/bash
#
while true
do
        read -p "please input a positive number: " num
        # 判断数是否是整数
        expr $num + 1 &> /dev/null
        if [ $? -eq 0 ];then
                # 判断这个整数是否大于0,大于0返回1
                if [ `expr $num \> 0` -eq 1 ];then
                        #echo "yes,positive number"
                        # $sum没有赋值,默认为0
                        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"
        continue
done
# bc介绍
bc是bash内建的运算器,支持浮点数运算
内建变量scale可以设置,默认为0
bc操作符对照表
操作符        含义
num1 + num2    求和
num1 - num2    求差
num1 * num2    求积
num1 / num2    求商
num1 % num2    求余
num1 ^ num2    指数运算
centos7默认没有安装bc命令
yum install -y bc
# 交互模式
[root@es01 shell]# 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'. 
23 + 5
28
23 - 8
15
23 * 6
138
23 / 5
4
23 % 5
3
# 小数点保留2位
scale=2
23 / 5
4.60
# 小数点保留6位
scale=6
23 / 7
3.285714
# 脚本中使用管道符进行计算
[root@es01 shell]# echo "23+33" | bc
56
[root@es01 shell]# echo "23.3+66" | bc
89.3
# 保留精度 scale=4; 用分号隔开
[root@es01 shell]# echo "scale=4;23.3/3.5" | bc
6.6571
# bc示例脚本
[root@es01 shell]# 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 "$num1 / $num2 = $num3"
[root@es01 shell]# sh bc.sh 
num1: 5.6
num2: 3
5.6 / 3 = 1.8666
操作符        含义
num1 + num2    求和
num1 - num2    求差
num1 * num2    求积
num1 / num2    求商
num1 % num2    求余数
bash数学运算之expr:
# 比较大小,只能对整数进行比较
[root@es01 ~]# num1=30
[root@es01 ~]# num2=50
# 错误:没有加空格
[root@es01 ~]# expr $num1>$num2
[root@es01 ~]# echo $?
0
[root@es01 ~]# echo $num2
50
# 错误:没有转义
[root@es01 ~]# expr $num1 > $num2
# 正确写法
[root@es01 ~]# expr $num1 \> $num2
0
[root@es01 ~]# num1=100
[root@es01 ~]# echo $num1
100
[root@es01 ~]# expr $num1 \> $num2
1
# 小于、小于等于、大于等于
[root@es01 ~]# expr $num1 \< $num2
0
[root@es01 ~]# expr $num1 \<= $num2
0
[root@es01 ~]# expr $num1 \>= $num2
1
# 运算 加、减、乘、除
[root@es01 ~]# num1=17
[root@es01 ~]# num2=5
[root@es01 ~]# expr $num1 + $num2
22
[root@es01 ~]# num3=`expr $num1 + $num2`
[root@es01 ~]# echo $num3
22
[root@es01 ~]# expr $num1 - $num2
12
[root@es01 ~]# expr $num1 \* $num2
85
[root@es01 ~]# expr $num1 / $num2
3
# 取余数
[root@es01 ~]# expr $num1 % $num2
2
# 两个小括号的计算方法,要赋值,否则会报错
[root@es01 ~]# $(($num1+$num2))
-bash: 22: command not found
[root@es01 ~]# num3=$(($num1+$num2))
[root@es01 ~]# echo $num3
22
[root@es01 ~]# num3=$(($num1*$num2))
[root@es01 ~]# echo $num3
85
[root@es01 ~]# num3=$(($num1-$num2))
[root@es01 ~]# echo $num3
12
[root@es01 ~]# num3=$(($num1/$num2))
[root@es01 ~]# echo $num3
3
# 部分支持,= 不支持
[root@es01 ~]# num3=$(($num1>$num2))
[root@es01 ~]# echo $num3
1
[root@es01 ~]# num3=$(($num1<$num2))
[root@es01 ~]# echo $num3
0
[root@es01 ~]# num3=$(($num1=$num2))
-bash: 17=5: attempted assignment to non-variable (error token is "=5")
在比较运算的时候最好使用expr
练习例子:
提示用户输入一个正整数num,然后计算1+2+3+...+num的值;必须对num是否为正整数做判断,不符合应当运行再次输入
# 判断是否大于0
[root@es01 ~]# num1=56
[root@es01 ~]# expr $num1 \> 0
1
# expr只能对整数进行计算,直接用expr 和一个整数计算获取 $? 的值来判断是否为整数
[root@es01 ~]# num1=56.58
[root@es01 ~]# expr $num1 \> 0
1
[root@es01 ~]# expr $num1 + 1
expr: non-integer argument
[root@es01 ~]# echo $?
2
[root@es01 ~]# num1=90
[root@es01 ~]# expr $num1 + 1
91
[root@es01 ~]# echo $?
0
# 具体脚本
# vim sum.sh
#!/bin/bash
#
while true
do
        read -p "please input a positive number: " num
        # 判断数是否是整数
        expr $num + 1 &> /dev/null
        if [ $? -eq 0 ];then
                # 判断这个整数是否大于0,大于0返回1
                if [ `expr $num \> 0` -eq 1 ];then
                        #echo "yes,positive number"
                        # $sum没有赋值,默认为0
                        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"
        continue
done
# bc介绍
bc是bash内建的运算器,支持浮点数运算
内建变量scale可以设置,默认为0
bc操作符对照表
操作符        含义
num1 + num2    求和
num1 - num2    求差
num1 * num2    求积
num1 / num2    求商
num1 % num2    求余
num1 ^ num2    指数运算
centos7默认没有安装bc命令
yum install -y bc
# 交互模式
[root@es01 shell]# 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'. 
23 + 5
28
23 - 8
15
23 * 6
138
23 / 5
4
23 % 5
3
# 小数点保留2位
scale=2
23 / 5
4.60
# 小数点保留6位
scale=6
23 / 7
3.285714
# 脚本中使用管道符进行计算
[root@es01 shell]# echo "23+33" | bc
56
[root@es01 shell]# echo "23.3+66" | bc
89.3
# 保留精度 scale=4; 用分号隔开
[root@es01 shell]# echo "scale=4;23.3/3.5" | bc
6.6571
# bc示例脚本
[root@es01 shell]# 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 "$num1 / $num2 = $num3"
[root@es01 shell]# sh bc.sh 
num1: 5.6
num2: 3
5.6 / 3 = 1.8666