变量的数值计算觉的有如下命令

(())、let、expr、bc、$[]

下面看看数值计算的运算符

shell-变量的数值计算_第1张图片

(())此法很常用且效率高,用于执行整数型的计算,不支持浮点型。

如图

[root@localhost ~]# ((a=1+2**3-4%3))

[root@localhost ~]# echo $a

8

[root@localhost ~]# b=$((1+2**3-4%3))

[root@localhost ~]# echo $b

8

[root@localhost ~]# 

其中2**3是2的3次方

[root@localhost ~]# echo $((a++))

8

[root@localhost ~]# echo $a

9

[root@localhost ~]# echo $((a--))

9

[root@localhost ~]# echo $a

8

[root@localhost ~]# echo $((++a))

9

[root@localhost ~]# echo $a

9

[root@localhost ~]# echo $((--a))

8

[root@localhost ~]# echo $a

8

[root@localhost ~]# 

由上面可以看到,$((a++))是先输出a原来的值再去加,然后我们echo $a的时候,实际上就是输出变量a运算后的值啦。

记忆方法:变量在前,先输出变量值,变量在后,就是先去处后输出变量的值

上面都是整数的,如果有小数的话就会报错了,如果想用小数的话可以用bc命令

[root@localhost ~]# cat test.sh

#!/bin/bash

a=6

b=2

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 ))"

[root@localhost ~]# sh test.sh 

a-b=4

a-b=8

a-b=12

a-b=3

a-b=36

a-b=0

如果你想通过命令行传参的方式实现上面的运算的话可以修改脚本为以下的

#!/bin/bash

a=$1

b=$2 

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 ))"

如图:执行命令

"test.sh" 9L, 167C 已写入

[root@localhost ~]# sh test.sh 8 2

a-b=6

a-b=10

a-b=16

a-b=4

a-b=64

a-b=0

[root@localhost ~]# sh test.sh 8 3

a-b=5

a-b=11

a-b=24

a-b=2

a-b=512

a-b=2

下面我们做一个小的计算器

[root@localhost shell]# cat compute.sh 

#!/bin/bash

echo $(($1$2$3))

[root@localhost shell]# sh compute.sh 1+2

3

[root@localhost shell]# 

当然这个是比较简单的,很多的bug我们可以看看其他人写的

http://chenhao6.blog.51cto.com/6228054/1232070

其中的一些代码就写的不错,如下

#!/bin/bash
echo " ----------------------------------"
echo "|这是一个简单的整数计算器,作者YUAN|"
echo " ----------------------------------"
echo
while :
do
read -p  "请输入一个整数: " nu
expr $nu + 0 &> /dev/null
if [ $? -eq 0 ]
 then
       echo "第一个数是$nu"
       break

else
       echo "您输入的$nu不是整数请重新输入"
fi
done

while :
do
read -p  "请输入二个整数: " nu2
expr $nu2 + 0 &> /dev/null
if [ $? -eq 0 ]
 then
       echo "第二个数是$nu2"
       break
else
       echo "您输入的$nu2不是整数请重新输入"
fi
done
echo  "------------------"
echo "|  1.加法          |"
echo "|  2.减法          |"
echo "|  3.乘法         |"
echo "|  4.除法         |"
echo  "------------------"
read -p "请输入您想执行的算法:" me
case $me in
       "1")
sum=`expr $nu + $nu2`
echo "$nu+$nu2=$sum"
;;
       "2")
jian=`expr $nu - $nu2`
echo "$nu-$nu2=$jian"
;;
       "3")
chen=`expr $nu \* $nu2`
echo "$nu*$nu2=$chen"
;;
       "4")
chu=`expr $nu / $nu2`
echo "$nu/$nu2=$chu"
esac

还有一种方法可以用来判断输入是不是为数字

[ -z `echo "$1"|sed 's/[0-9]//g'`  ] && echo 1||echo 0

上面的解析是说如果$1把数字删除了,还是不是空的,如果是空的,就输出1如果不是就输出0