@cdmonkey
2014-12-03T15:34:33.000000Z
字数 3940
阅读 1142
shell
以下方法都可以进行变量的数值(除了bc,其余的方法只能够进行整数运算)计算。
expr
指令一般用于整数值,但也可用于字符串,用来求表达式的值。同时,expr
也是一个命令行计算器。
指令格式:expr Expression
#需要注意:运算符两边都要有空格,也就是说两个运算值以及运算符之间要用空格隔开。
[root@MySQL-E ~]# expr 2 + 50
52
[root@MySQL-E ~]# expr 2 \* 50
100
#对于乘法运算符需要转意,而除法及取余运算符则无需转意。
#目前还不支持幂运算。
#还可以使用expr在循环控制语句中进行增量计算。首先,循环初始化为0,然后循环值加1,并使用反引号。
#但是,这样的用法执行效率不佳,应避免使用。
[root@WEB-A1 test]# i=0
[root@WEB-A1 test]# i=`expr $i + 1`
[root@WEB-A1 test]# echo $i
1
还可以将中括号与expr
相结合来使用:
expr $[Expression]
#中括号内的表达式书写对于空格并不敏感,书写要求比较宽松。
#其实如果将下面示例中的expr替换为echo,也是没有问题的,根本上讲,还是属于中括号本身的用法。
[root@WEB-A1 test]# expr $[2+3]
5
[root@WEB-A1 test]# expr $[2 ** 3]
8
特殊用法:
用法一:判断文件扩展名
expr STRING : REGEXP anchored pattern match of REGEXP in STRING
[root@WEB-A1 test]# cat file.sh
#!/bin/sh
#请注意判断表达式的写法,尽量遵循这种形式的写法。该方法适合判断文件扩展名。
if expr "$1" : ".*\.html" &>/dev/null
then
echo "This is a HTML file!"
else
echo "This is not a HTML file!"
fi
[root@WEB-A1 test]# sh file.sh index.html
This is a HTML file!
[root@WEB-A1 test]# sh file.sh index.asp
This is not a HTML file!
用法二:判断是否为整数
[root@WEB-A1 ~]# expr 1 + 2
3
[root@WEB-A1 ~]# expr 1 + 2.5
expr: non-numeric argument
[root@WEB-A1 ~]# expr 1 + a
expr: non-numeric argument
#如果运算参数不是整数,则会出现报错信息,换句话讲,就是返回码$?不为0。因此,我们可以利用这个原理来进行是否为整数的判断。
[root@WEB-A1 test]# cat test_integer.sh
#!/bin/sh
expr $1 + 1 &>/dev/null
if [ $? -eq 0 ]
then
echo "This arg is a integer!"
else
echo "Non-integer!"
fi
[root@WEB-A1 test]# sh test_integer.sh 5
This arg is a integer!
[root@WEB-A1 test]# sh test_integer.sh e
Non-integer!
这是比较常用的方法。只需要把算术表达式放入双小括号内即可。
常用运算符:
#左右的两个括号之间不能有空格,而对于表达式的书写要求较为宽松,运算值及运算符两边有无空格均可。
[root@MySQL-E ~]# echo $((5+2))
7
[root@MySQL-E ~]# answer=$(( 10*5 ))
[root@MySQL-E ~]# echo $answer
50
注意细节:如果是打印输出或是取值,则双小括号前面要加上美元符号($
),如果仅仅是计算或作为条件进行判断,则不能使用$
符号。另外,该方法对于书写的要求比较宽松。
[root@WEB-A1 test]# ((a=5+10*2-4%3)) #单纯的进行计算。
[root@WEB-A1 test]# echo $a
24
[root@WEB-A1 test]# echo $((a+=1))
25
#自增符号在后面(后缀式),则先引用后自增:前缀式是先加1再使用;后缀式是先使用再加1。
#自减运算:前缀式是先减1再使用;后缀式是先使用再减1。
#在自增或自减运算中,要分清表达式的值和变量的值。
[root@WEB-A1 test]# echo $((a++))
25
[root@WEB-A1 test]# echo $a
26
[root@WEB-A1 test]# cat bijiao.sh
#!/bin/sh
a=10
b=20
if ((a<b)) #将比较结果作为判断的条件。
then
echo "a<b"
fi
[root@WEB-A1 test]# sh bijiao.sh
a<b
#还有下面的用法,即输出判断结果,1表示成立(真),0表示不成立(假):
[root@WEB-A1 test]# echo $((3>2))
1
[root@WEB-A1 test]# echo $((3<2))
0
#书写要求较为宽松,运算值及运算符两边有无空格均可。
[root@MySQL-E ~]# echo $[4+6]
10
[root@MySQL-E ~]# answer=$[ 10-4 ]
[root@MySQL-E ~]# echo $answer
6
对于上面三种方法的小结:
注意,首先要求参加运算的数值必须为整数。
#加法(减法同):
[root@MySQL-E ~]# f1=`expr 4 + 5`
[root@MySQL-E ~]# f2=$((4+5))
[root@MySQL-E ~]# f3=$[4+5]
[root@MySQL-E ~]# echo $f1 $f2 $f3
9 9 9
#乘法(expr指令需要对运算符转意):
[root@MySQL-E ~]# f1=`expr 4 \* 5`
[root@MySQL-E ~]# f2=$((4*5))
[root@MySQL-E ~]# f3=$[4*5]
[root@MySQL-E ~]# echo $f1 $f2 $f3
20 20 20
#除法(expr指令需要对运算符转意):
[root@MySQL-E ~]# f1=`expr 20 \/ 4`
[root@MySQL-E ~]# f2=$((20/4))
[root@MySQL-E ~]# f3=$[20/4]
[root@MySQL-E ~]# echo $f1 $f2 $f3
5 5 5
#取模运算:
[root@MySQL-E ~]# f1=`expr 20 \% 6`
[root@MySQL-E ~]# f2=$((20%6))
[root@MySQL-E ~]# f3=$[20%6]
[root@MySQL-E ~]# echo $f1 $f2 $f3
2 2 2
#幂运算:expr指令没有幂运算。
[root@MySQL-E ~]# f2=$((10**3))
[root@MySQL-E ~]# f3=$[10**3]
[root@MySQL-E ~]# echo $f2 $f3
1000 1000
指令格式:let arg [arg ...] 每个参数都是一个求值的算术表达式。
[root@MySQL-E ~]# n=10
[root@MySQL-E ~]# let n=n+1
[root@MySQL-E ~]# echo $n
11
#使用let命令可以使后面所接的参数,或者说是表达式,进行算数运算。
首先,bc
是一个支持浮点数,功能完备的计算器。其次,其使用方式有两种,一种是直接进入bc
的运行界面,进行运算操作;另一种是在命令行中通过echo
及管道符向其输送操作指令进行运算。
#第一种使用方法不在此介绍。我们来看第二种使用方法:
[root@WEB-A1 ~]# echo "5+5"|bc
10
[root@WEB-A1 ~]# echo "0.618+3.14"|bc
3.758
实例:计算从1加到10的结果
#方法一,可以使用循环语句:
[root@WEB-A1 test]# cat 1-10.sh
#!/bin/sh
SUM=0
for ((i=1;i<=10;i++))
do
SUM=$(($SUM+$i))
done
echo $SUM
[root@WEB-A1 test]# sh 1-10.sh
55
#方法二,更为简洁的方法是使用seq以及bc命令相结合:
[root@WEB-A1 test]# echo `seq -s + 10`|bc
55
#或者也可以这样:
[root@WEB-A1 test]# echo {1..10}|sed 's# #+#g'|bc
55
#方法三,这是最简单的方法了:
[root@WEB-A1 test]# echo $((`seq -s + 10`))
55
#除此之外,还有许多的方法,但基本思路是一样的。
对于+1
操作,可以使用下面的方法:
[root@MySQL-E ~]# m=9
[root@MySQL-E ~]# m=$[m + 1];echo $m
10
[root@MySQL-E ~]# m=9
[root@MySQL-E ~]# m=`expr $m + 1`;echo $m
10
[root@MySQL-E ~]# m=9
[root@MySQL-E ~]# m=$(($m + 1));echo $m
10
[root@MySQL-E ~]# m=9
[root@MySQL-E ~]# let m=m+1;echo $m
10
#当然了,这样可不行呦~
[root@MySQL-E ~]# m=9
[root@MySQL-E ~]# m=$m+1
[root@MySQL-E ~]# echo $m
9+1
程序实例:从1加到100
#!/bin/sh
i=1
sum=0
while [ $i -le 100 ]
do
sum=`expr $sum + $i`
i=`expr $i + 1`
done
echo $sum