2023年8月2日发(作者:)
详解Shell编程之变量数值计算(⼀)如果要执⾏运算,那就少不了运算符,和其他的编程语⾔相似,shell也有很多的运算符如下:+、-、:代表着加号 和减号 或者,负号*、/、%:代表着乘号,除号,和取模。** : 幂运算++、-- :表⽰着增加或者减少,它可以放在前置,也可以放在变量的结尾!、||、&&、(取反)(或) (and)<、<=、>、>= :⽐较符号,⼩于、⼩于等于、⼤于、⼤于等于==、!=、= :相等,不相等, =表⽰相等于<< >> 向左移动 向右移动等等,这⾥就不说了 到后⾯实践中再见!Shell编程之算术运算命令(()) ⽤于整数之间常⽤的运算符,效率⾼let :⽤于整数运算,类似于(())expr :⽤于整数运算,但是还有其他功能bc :Linux下的⼀个计算程序,适合整数及⼩数运算$[] :⽤于整数运算awk:awk既可以整数运算,也可以⼩数运算declare: 定义变量值和属性,-i参数可以⽤于定义整形变量,做运算第⼀眼看到这些 感觉很复杂,⼼乱,但是没有关系,慢慢的就好了~~~⼀、双⼩括号(()) 数值运算命令双⼩括号的作⽤是进⾏数值运算与数值的⽐较,它的效率很⾼,⽤法很灵活,是企业运维⼈员经常采⽤的操作符((e=e+1)) 它的作⽤就是把e+1的结果赋值给变量e但是不可以⽤ echo ((e=e+1))来使⽤,但可以使⽤echo $((e=e+1))e=$((e=e+1)) 作⽤就是把e+1的执⾏结果赋值给变量e数值⽐较((8>7&&5==5)) ⽤于数值之前的⽐较,⽤于条件判断echo $((2+1)) ⽤于直接输出运算表达式的结果,在(()) 前⾯加$符号案例1:双⼩括号"(())"数值运算实践[root@shell-yankerp sh]# echo $((1+1)) #计算1+1后输出
2 #那么结果就是等于2
[root@shell-yankerp sh]#
以此类推使⽤减号[root@shell-yankerp sh]# echo $((6-3)) #计算6-3等于多少
3 #结果为3
[root@shell-yankerp sh]#
是不是感觉有点简单。那么接下来利⽤"(())"进⾏稍微复杂的⼀些综合算术运算[root@shell-yankerp sh]# ((a=1+2**3-4%3))
以上例⼦也就是说,⾸先a是⼀个变量名,那么在a=后⾯的⼀些计算的结果会赋值给a这个变量,那么⾸先我们得知道后⾯的计算结果是多少,在这个变量中 我们⽤到了+号"**"以及"-"号包括“%”⾸先计算过程是这样的。先算乘除,后算加减2**3 等于 2x2x2=8 乘算出来之后算除。 4%3=1 取模---- 8-1=7 最后1+7=8 最后结果为8 输出如下:例如2:[root@shell-yankerp sh]# b=$((1+2**3-4%3)) #在这⾥b是⼀个变量 将变量名的计算结果赋值给b
[root@shell-yankerp sh]# echo $b #输出如下:
8
[root@shell-yankerp sh]#
其实例1 和2都是差不多的 只不过是⽤了不同的⽅法例3:特殊运算符号的运算实例[root@shell-yankerp sh]# a=8 #⾸先a变量名 = 变量值 等于8 那么a就是8
[root@shell-yankerp sh]# echo $((a=a+2)) #原来a=8 那么现在a+2 结果为10
10
[root@shell-yankerp sh]# echo $((a+=1)) #当结果为10 这⼀⾏代表 a=a+1那么就等于11
11
[root@shell-yankerp sh]# echo $((a**2)) #⽬前a=11 那么a**2 a的⼆次⽅ 那么等于11x11=121 输出如下:
121
[root@shell-yankerp sh]#
例4:利⽤(())双括号,进⾏⽐较判断[root@shell-yankerp sh]# echo $((2>1)) #当条件2>1正确后输出了1表⽰真 1
[root@shell-yankerp sh]# echo $((2>3)) #当条件2>3错误后输出0
0
[root@shell-yankerp sh]# echo $((6==6)) #6==6 那么就输出1
1
[root@shell-yankerp sh]#
if 判断⼩实战在以上的图中不⽤想肯定是输出条件成⽴继续运⾏了因为8本来就⼤于5;7本来就等于7 输出如下:我们尝试的改下脚本如下:在上图中8等于5肯定是错误的 那么输出如下:上⾯涉及到了数字及变量必须为整数,不能是⼩数... 但是可以⽤bc来解决后⾯会说到。案例:在变量前后使⽤++、--、特殊运算符的表达式⾸先我们需要知道++是什么意思++、-- :表⽰着增加或者减少,它可以放在前置,也可以放在变量的结尾[root@shell-yankerp sh]# a=10
[root@shell-yankerp sh]# echo $((a++))
10
[root@shell-yankerp sh]# echo $a
11
[root@shell-yankerp sh]#
以上内容中的a=10 那么a是变量名 变量值等于10 那么echo $((a++)) ++的意思上⾯已经说过了,输出结果为10 因为++在a的后⾯ 所以先输出a的值为10 那么继续echo $a 那么就变成11 因为a++后⾯增加1例2:[root@shell-yankerp sh]# a=11
[root@shell-yankerp sh]# echo $((a--))
11
[root@shell-yankerp sh]# echo $a
10
[root@shell-yankerp sh]#
以上就是--的⽤法了。这⾥不在说了在以下的案例中我相信的⼤家肯定知道了在前⾯加++ 和在后⾯加++的区别了 如下:[root@shell-yankerp sh]# echo $a
10
[root@shell-yankerp sh]# echo $((--a))
9
[root@shell-yankerp sh]# a=9
[root@shell-yankerp sh]# echo $a
9
[root@shell-yankerp sh]# echo $((++a))
10
[root@shell-yankerp sh]#
例:通过(())运算后赋值给变量[root@shell-yankerp sh]# yankerp=99
[root@shell-yankerp sh]# echo $((yankerp+1))
100
[root@shell-yankerp sh]# echo $(( yankerp+1 ))
100
[root@shell-yankerp sh]#
在以上的案例中,有空格和没空格都是⼀样的。
包含(())各种常见的运算符命令执⾏如下:[root@shell-yankerp sh]# echo $((3+2))
5
[root@shell-yankerp sh]# echo $((3-2))
1
[root@shell-yankerp sh]# echo $((3**2))
9
[root@shell-yankerp sh]# echo $((3*2))
6
[root@shell-yankerp sh]# echo $((3/2))
1
[root@shell-yankerp sh]# echo $((3%2))
1
[root@shell-yankerp sh]#
各种(())运算的shell脚本案例#!/bin/bash
# DATE:Wed Jan 31 19:49:59 CST 2018
# This is a yankerp!
a=6
b=3
echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a/b=$((a/b))"
echo "a**b=$((a**b))"
输出结果为如下:[root@shell-yankerp sh]# sh
a-b=3
a+b=9
a/b=2
a**b=216
[root@shell-yankerp sh]#
特殊位置变量+数值运算实战案例如下:#!/bin/bash
# DATE:Wed Jan 31 19:49:59 CST 2018
# This is a yankerp!
a=$1
b=$2
echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a**b=$((a**b))"
echo "a/b=$((a/b))
运⾏结果如下:[root@shell-yankerp sh]# sh 6 3
a-b=3
a+b=9
a**b=216
a/b=2
[root@shell-yankerp sh]#
这也就是特殊位置变量+本章的变量数值运算的结合let运算命令的⽤法例如[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# a=a+8 #没有⽤let
[root@shell-yankerp ~]# echo $a
a+8 #输出结果
[root@shell-yankerp ~]# unset a #清除变量
[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# let a=a+8 使⽤let
[root@shell-yankerp ~]# echo $a
10
[root@shell-yankerp ~]#
其实还可以这么实现,如下:[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# echo $((a=a+8))
10
[root@shell-yankerp ~]# echo $a
10
[root@shell-yankerp ~]# unset a
[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# let a=a+8
[root@shell-yankerp ~]# echo $a
10
[root@shell-yankerp ~]#
两者区别如上expr命令⽤法实例:[root@shell-yankerp sh]# expr 2 + 2
4
[root@shell-yankerp sh]# expr 4 - 2
2
[root@shell-yankerp sh]# expr 4 * 2
8
[root@shell-yankerp sh]# expr 4 / 2
2
[root@shell-yankerp sh]#
当我们选择⽤*号需要拿转义、需要注意在⽤expr命令时 左右两侧必须要空格2、expr配合变量实例[root@shell-yankerp sh]# a=10
[root@shell-yankerp sh]# a=`expr $a + 10`
[root@shell-yankerp sh]# echo $a
20
[root@shell-yankerp sh]#
expr的企业级实战案例:[root@shell-yankerp sh]# i=5 #这⾥设置了⼀个变量 i=5
[root@shell-yankerp sh]# expr $i + 6 &>/dev/null #那么我们使⽤expr命令 $i + 6 这⾥的6是⼀个整数
[root@shell-yankerp sh]# echo $? #执⾏完成后我们使⽤特殊变量 $?来判断以上命令
0 ---返回结果为0
[root@shell-yankerp sh]# expr $i + zhangsan &>/dev/null #同时这⾥⼜设置了⼀个变量 在这⾥的zhangsan是字符串
[root@shell-yankerp sh]# echo $? #使⽤特殊变量判断
2 #结果为2
[root@shell-yankerp sh]#
利⽤expr做计算,将⼀个未知的变量和⼀个已知的⼀个整数相加,看返回的值是否为0,如果默认是0 那么就是⼀个整数。如果⾮0则输⼊的就是字符串不是整数。例:通过参数判断输出内容是否为整数#!/bin/bash
expr $1 + 1 &>/dev/null #这⾥是⼀个命令 使⽤了expr 也使⽤了特殊的位置变量
if [ "$?" -eq 0 ] #如果以上命令执⾏结果为0
then #那么
echo "输⼊的是整数~" #输出⼀条 输⼊的是整数
else #否则
echo "/bin/sh $# 请输⼊⼀个整数" 这⾥也使⽤了特殊的位置变量
fi
运⾏脚本测试[root@shell-yankerp sh]# cat
#!/bin/bash
expr $1 + 1 &>/dev/null
if [ "$?" -eq 0 ]
then
echo "输⼊的是整数~"
else
echo "/bin/sh $0 请输⼊⼀个整数"
fi
[root@shell-yankerp sh]# sh 123
输⼊的是整数~
[root@shell-yankerp sh]# sh zhangsan lisi
/bin/sh 请输⼊⼀个整数
[root@shell-yankerp sh]#
实战:第⼀关判断参数个数是否为2.若不是请给出提⽰ 第⼆关判断参数是否为整数,如果不是那么继续给出提⽰ 第三关做运算~~~#!/bin/bash
if [ "$#" -ne "2" ]
then
echo "/bin/bash $0 请输出两个数值..."
exit 1
fi
#no.2
a=$1
b=$2
expr $1 + 1 &>/dev/null
if [ "$?" -ne "0" ]
then
echo "请输⼊数值..."
exit 1
fi
#no.3
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))"
剖析:在以上脚本中其实很简单,第⼀if 如果输⼊的不是两个传参值,那么给出提⽰ 这是第⼀段if条件语句,如果输⼊的是两个数值,那么继续执⾏下⾯的条件,在第⼆个条件使⽤了位置参数变量$1 使⽤了expr命令来判断⽤户输⼊的是数字还是字符串,当⽤户输⼊的是数字那么就是返回是成功的 那么我们使⽤了if语句 如果上⾯命令执⾏成功 如果不等于0 那么给出相应的提⽰,最后前⾯的两个条件成⽴,那么接下来进⾏算法,这个前⾯是说过的。执⾏脚本如下:好了 本次就到这⾥,希望阅读者快快吸收~~~ 后续不断更新 谢谢⼤家,也希望⼤家多多⽀持。声明:以上⽂章是<<跟着⽼男孩学Linux运维Shell编程实战>>第五章;⼀部分看完的总结!
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690919664a463599.html
评论列表(0条)