SHELL (4) —— 变量的数值计算实践
摘自:Oldboy Linux运维——SHELL编程实战
利用(())双括号进行比较及判断:
[root@yeebian ~]# echo $((3<8)) 1 #1表示真。 [root@yeebian ~]# echo $((8<3)) 0 #0表示假。 [root@yeebian ~]# echo $((8==8)) 1 [root@yeebian ~]# if ((8>7&&5==5)) > then > echo yes > fi yes
上面涉及的数字及变量必须为整数(整型),不能是小数(浮点数)或字符串。
在变量前后使用--和++特殊运算符的表达式。
[root@yeebian ~]# a=10 [root@yeebian ~]# echo $((a++)) 10 [root@yeebian ~]# echo $a 11 [root@yeebian ~]# a=11 [root@yeebian ~]# echo $((a--)) 11 [root@yeebian ~]# echo $a 10 [root@yeebian ~]# a=10 [root@yeebian ~]# echo $a 10 [root@yeebian ~]# echo $((--a)) 9 [root@yeebian ~]# echo $a 9 [root@yeebian ~]# echo $((++a)) 10 [root@yeebian ~]# echo $a 10
有关++、--运算的记忆方法:
变量a在运算符之前,输出表达式的值为a,然后a自增或自减;变量a在运算符之后,输出表达式会先自增或自减,表达式的值就是自增或自减后a的值。
各种(())运算的Shell脚本示例。
[root@yeebian ~]# vim test.sh testchars #!/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@yeebian ~]# bash test.sh a-b=4 a+b=8 a*b=12 a/b=3 a**b=36 a%b=0
由此延伸的脚本:
[root@yeebian ~]# vim test.sh #!/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))" [root@yeebian ~]# bash test.sh 10 5 a-b=5 a+b=15 a*b=50 a/b=2 a**b=100000 a%b=0
计算字符串长度:
[root@yeebian ~]# char="I am studying Shell." [root@yeebian ~]# expr length "$char" 20 [root@yeebian tmp]# echo ${#char} 20 [root@yeebian tmp]# echo $char | wc -L 20 [root@yeebian tmp]# echo $char | awk '{print length($0)}' 20
其中echo ${#char}这种方式是最快的。
expr实践
判断参数个数是否为2,若不是,则给出提示终止运行;
判断传入的参数是否为整数,若不是,则给出提示终止运行;
做运算。
[root@yeebian vurtne]# vim shell.sh #!/bin/bash [ $# -ne 2 ]&&{ echo $"USAGE $0 NUM1 NUM2" exit 1 } a=$1 b=$2 expr $a + $b + 110 &>/dev/null if [ $? -ne 0 ] then echo "You must input two nums." exit 2 fi 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@yeebian vurtne]# bash shell.sh 1 q You must input two nums. [root@yeebian vurtne]# bash shell.sh 0 USAGE shell.sh NUM1 NUM2 [root@yeebian vurtne]# bash shell.sh 8 2 a-b=6 a+b=10 a*b=16 a/b=4 a%b=0 a**b=64
通过一条命令计算输出1+2+3+...+10的表达式,并计算结果:
[root@yeebian ~]# echo `seq -s '+' 10` = `seq -s "+" 10 | bc` 1+2+3+4+5+6+7+8+9+10 = 55 [root@yeebian ~]# echo "`seq -s '+' 10` = "$((`seq -s "+" 10`)) 1+2+3+4+5+6+7+8+9+10 = 55 [root@yeebian ~]# echo `seq -s '+' 10` = `seq -s " + " 10 | xargs expr` 1+2+3+4+5+6+7+8+9+10 = 55 [root@yeebian ~]# echo `seq -s "+" 10` = $(echo $[`seq -s "+" 10`]) 1+2+3+4+5+6+7+8+9+10 = 55
awk计算
[root@yeebian ~]# echo "7.7 3.8" | awk '{print ($1-$2)}' 3.9 [root@yeebian ~]# echo "358 113" | awk '{print ($1-3)/$2}' 3.14159 [root@yeebian ~]# echo "3 9" | awk '{print ($1+3)*$2}' 54
read命令实践
[root@yeebian vurtne]# vim shell.sh #!/bin/bash read -p "Please input two num:" a b [ ${#a} -le 0 ]&&{ echo "The first num is null" exit 1 } [ ${#b} -le 0 ]&&{ echo "The second num is null" exit 1 } expr $a + 1 &>/dev/null RETVAL_A=$? expr $b + 1 &>/dev/null RETVAL_B=$? if [ $RETVAL_A -ne 0 -o $RETVAL_B -ne 0 ] then echo "One of the num is not num,please input again." exit 1 fi 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@yeebian vurtne]# bash shell.sh Please input two num:1 qq One of the num is not num,please input again. [root@yeebian vurtne]# bash shell.sh Please input two num:qq The second num is null [root@yeebian vurtne]# bash shell.sh Please input two num:5 The second num is null [root@yeebian vurtne]# bash shell.sh Please input two num:5 6 7 One of the num is not num,please input again. [root@yeebian vurtne]# bash shell.sh Please input two num:5 7 a-b=-2 a+b=12 a*b=35 a/b=0 a%b=5 a**b=78125