您的位置:首页 > 运维架构 > Shell

[置顶] shell之变量的数值计算实践详解

2018-03-04 17:45 766 查看
一、算术运算符
如果要执行算术运算符,就离不开各种运算符号,和其他编程语言类似,shell也有很多算术运算符。
下面就给大家来介绍一些常见的shell算术运算符以及常见的shell算术运算命令。
1.shell中常见的算术运算符+、- :加法(或正括号),减法(或负号)

*、/、%:乘法、除法、取余(取模)

**:幂运算

++、--:增加及减少、可前置也可放在变量结尾

!、&&、||:逻辑非(取反)、逻辑与(and)、逻辑或(or)

<、<=、>、>=:比较符号(小于、小于等于、大于、大于等于)

==、!=、=:比较符号(相等、不相等,对于字符串“=”也可以表示相当于)

<<、>>:向左移位、向右移位

~、|、&、^:按位取反、按位异或、按位与、按位或

=、+=、-=、*=、/=、%=:赋值运算符,例如a+=1相当于a=a+1,a-=1相当于a=a-1*2.shell中常见的算术运算命令(()):用于整数运算的常用运算符,效率很高

let:用于整数运算,类似于“(())”

expr:可用于整数运算,但还有很多其他的额外功能

bc:Linux下的一个计算器程序(适合整数及小数运算)

$[]:用于整数运算

awk:awk既可以用于整数运算,也可以用于小数运算。

declare:定义变量值和属性,-i参数可以用于定义整形变量,做运算。双小括号“(())”数值运算命令
双小括号的作用:是进行数值运算与数值进行比较,它的效率很高,用法灵活。
其语法如下所示:
((i=i+1)):此种书写方法作为运算后赋值法,即将i+1的运算后结果赋值给变量i。注意,不能用echo((i=i+1))的形式输出表达式的值,但可以用echo $((i=i+1))输出其值。
i=$((i+1)):可以在(())前加$符,表示将表达式运算后赋值给i
((8>7&&5==5)):可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断
echo $((2+1)):需要直接输出运算表达式的运算结果时,可以在“(())”前加$符号。
例如以下案例:



注意:上面涉及的数字及变量必须为整数(整型),不能是小数(浮点数)或字符串。
后面的bc和awk命令可以用于进行小数(浮点数)运算,但一般用到的较少。



执行echo $((a++))和echo $((a--))命令输出整个表达式时,输出的值即为a的值,表达式执行完毕后,会对a进行++、--的运算,而执行echo $((++a))和echo $((--a))命令输出整个表达式时,会先对a进行++、--的运算,然后再输出表达式的值,即为a运算后的值。



在(())中使用变量时可以去掉变量前的$符号。
(())表达式在命令执行时不需要加$符号,直接使用((6%2))形式即可,但是如果需要输出,就要加$符
(())里的所有字符之间没有空格、有一个或多个空格都不会影响结果。
下面运行个简单的脚本示例:[root@kang ~]# vim a.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))"


二、let运算命令的用法
let运算命令的语法格式为:let赋值表达式
let赋值表达式的功能等同于“((赋值表达式))”



接下来这个案例就是利用了let的方式实现了监控web服务状态,如果访问两次失败,则报警#!/bin/bash
Checkurl(){
timeout=5
fails=0
success=0
while true
do
wget --timeout=$timeout --tries=1 http://www.baidu.com -q -o /dev/null
if [ $? -ne 0 ];then
let fails=fails+1
else
let success+=1
fi
if [ $success -ge 1 ];then
echo success
exit 0
fi
if [ $fails -ge 2 ];then
Critical="sys is down."
echo $Critical|tee|mail -s "$Critical" 15011147011@163.com
exit 2
fi
done
}
Checkurl




三、expr命令的用法
expr(evaluate(求值)expressions(表达式))命令既可以用于整数运算,也可以用于相关字符串长度、匹配等的运算处理。
1.expr用于计算



要注意:在使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则会报错。
使用乘号时,必须使用反斜线屏蔽其特定含义,因为shell可能会误解*号的含义。
2.expr配合变量计算
expr在shell中可配合变量进行计算,但需要使用反引号将计算表达式括起来。
例如:



expr的企业级实战案例详解
1.判断一个变量值或字符串是否为整数
通过expr判断变量或字符串是否为整数:



结论:利用expr做计算,将一个未知的变量和一个已知的整数相加,看返回值是否为0,如果为0就认为做加法的变量为整数,否则就不是整数。
通过传参内容判断是否为整数:



输出结果:



通过read读入持续等待输入例子:



输出结果:



将上面用到的混合运算小程序改成输入两个参数后进行计算的程序,并且要能判断传参的个数及通过expr判断传入的参数是否为整数。
例如1:



输出结果:



例如2:



输出结果:



此外,用expr match功能进行整数判断时,可执行man expr命令获得帮助。
例如:



输出结果:



2.expr的特殊用法:判断文件扩展名是否符合要求
通过expr判断文件扩展名是否符合要求



输出结果:



3.通过expr计算字符串的长度




编写如下shell脚本,打印语句中字符数不大于6的单词。



执行结果如下:



四、bc命令的用法
bc是unix/Linux下的计算器,因此,除了可以作为计算器来使用,还可以作为命令行计算工具使用



将bc用在命令行下面实现运算功能



利用bc配合变量运算:



根据bc所具有的特殊性来看,如果是小数,则选择bc运算没有问题,若是整数场景,可用“(())”、let、expr等。
接下来通过一条命令计算输出1+2+3+..........+10的表达式,并计算出结果,使用bc命令计算



bc命令的独有特点是除了支持整数运算之外,还支持小数运算。
五、awk实现计算
利用awk进行运算的效果也很好,适合小数和整数,特别是命令行计算,尤其是小数,运算很精确,好用。



六、declare(同typeset)命令的用法
接下来要讲解的是使用typeset定义整数变量,直接进行计算。这个方法不是很常用,因为需要定义才能生效。



七、$[]符号的运算示例



打印数学杨辉三角的脚本



输出结果如下:



八、基于shell变量输入read命令的运算实践
shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获得,read为bash内置命令,可通过help read查看帮助
常用参数:
-p prompt:设置提示信息
-t timeout:设置输入等待的时间,单位默认为秒。
例如:



提示:read的读入功能就相当于交互式接受用户输入,然后给变量赋值。
接下来把前面加减乘除计算传参的脚本改成通过read方式读入整数变量。
例如:



输出结果如下:



好了,到这里有关于shell之变量的数值计算实践就演示完毕了,希望对你有所帮助!!!!再见!!元宵节快乐!!!!




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: