shell_脚本开发_数值运算

发布时间 2023-10-10 10:31:39作者: WeChat2834
shell中的数值运算
shell中常见的算术运算符
运算符 意义(*表示常用)
+、- 加号(正号)、减号(负号)*
*、/、% 乘号、除号、取余(取模)*
** 幂运算 *
++、-- 增加及减少,可前置也可放在变量结尾*
!、&&、|| 逻辑非(取反)、逻辑与(and)、逻辑或(or)*
<、<=、>、>= 比较符号(小于,小于等于,大于,大于等于)
==、!=、= 比较符号(相等,不相等,对于字符串'='也可以表示相等) *
<<、>> 向左移、或向右移
~、|、&、^ 按位取反,按位异或,按位与,按位或
=、+=、-=、*=,/=、%= 赋值运算符,例如a+=1相当于a=a+1
shell中常见的算术运算命令
运算操作符与运算命令 意义
(()) 相当于整数运算的常用运算符,效率很高
let 用于整数运算类似"(())"
expr 可以用于整数运算,但还有其他的额外功能
bc Linux下的一个计算器程序(适合整数及小数运算)
$[] 用于整数运算
awk awk即可用于整数运算,也可以用于小数运算
declare 定义变量值和属性,-i参数可以用于定义整形变量,做运算
用于数值计算的命令
  1. 双小括号(())
运算操作符与运算命令 意义
((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)) 需直接输出运算表达式的运算结果时,可在(())前加$符
[root@localhost ~]# #加减乘除
[root@localhost ~]# echo $((1+3))
4
[root@localhost ~]# echo $((3-10))
-7
[root@localhost ~]# echo $((10/3))
3
[root@localhost ~]# echo $((10/3)) #除法取商
3
[root@localhost ~]# echo $((10%3)) #取余取模运算
1
[root@localhost ~]# echo $((2**3)) #幂运算
8
[root@localhost ~]# echo $((1.5+1)) 
bash: 1.5+1: 语法错误: 无效的算术运算符 (错误符号是 ".5+1")
[root@localhost ~]# 
##############变量等赋值运算
[root@localhost ~]# echo $i

[root@localhost ~]# i=5
[root@localhost ~]# ((i*5))
[root@localhost ~]# echo $i
5
[root@localhost ~]# ((i=i*5))    ###只计算并未赋值
[root@localhost ~]# echo $i
25
[root@localhost ~]# echo ((i=i*5)) ###语法错误
bash: 未预期的符号 `(' 附近有语法错误
[root@localhost ~]# echo $i
25
[root@localhost ~]# echo $((i=i*5))
125
[root@localhost ~]# echo $i
125
[root@localhost ~]# 
#####复杂的运算;明确(())这个shell扩展计算的语法,在括号里面支持变量的定义,赋值操作,算法的优先级与数学运算一致
[root@localhost ~]# echo $a

[root@localhost ~]# ((a=2+2**3-4%3))
[root@localhost ~]# echo $a
9
[root@localhost ~]# 写法2,变量赋值在括号外面,必须加$符号,否则报错
[root@localhost ~]# b=((2+2**3-4%3))  ##未加$符号报错。
bash: 未预期的符号 `(' 附近有语法错误
[root@localhost ~]# b=$((2+2**3-4%3))
[root@localhost ~]# echo $b
9
[root@localhost ~]# 写法3,不用变量接收,直接获取值也需要$
root@localhost ~]# ((2+2**3-4%3))
[root@localhost ~]# echo ((2+2**3-4%3))
bash: 未预期的符号 `(' 附近有语法错误
[root@localhost ~]# echo $((2+2**3-4%3))
9
[root@localhost ~]# 
#######################也可以直接简单写
[root@localhost tmp]# cat calcualation2.sh
#!/bin/bash
echo "$(($1))"
[root@localhost tmp]# sh calcualation2.sh 1+2  ###因脚本只有一个参数,所以注意不要空格
3
[root@localhost tmp]#

注意 shell的一些基础命令,只支持整数的运算,小数的计算需要如bc这类方法才行

  1. 特殊符号 (++;--)
++  加一
--  减一
++a 先计算+1,再赋值给a
a++ 先对变量a操作,再进行+1
[root@localhost ~]# echo $a

[root@localhost ~]# a=5
[root@localhost ~]# echo $((++a))
6
[root@localhost ~]# echo $a
6
[root@localhost ~]# echo $((a++)) ###先把a的值赋值过去,最后再加1
6
[root@localhost ~]# echo $a
7
[root@localhost ~]# 

注意面试常遇到:echo $((a++)) 是先把a的值赋值出去,然后再加1

  1. let 命令:let命令的执行,效果等同于双小括号(()),但是双小括号效率更高
###let实践
[root@localhost tmp]# num=8
[root@localhost tmp]# num=num+8
[root@localhost tmp]# echo $num
num+8
[root@localhost tmp]# num=$num+8
[root@localhost tmp]# echo $num    #####可以看出bash的基础是不支持运算的
num+8+8
[root@localhost tmp]# unset num
[root@localhost tmp]# num=5
[root@localhost tmp]# let num=num+5  ###let 命令等效于双小括号(())
[root@localhost tmp]# echo $num
10
[root@localhost tmp]# num2=5
[root@localhost tmp]# echo "$((num2=num2+5))"
10
[root@localhost tmp]# 

  1. expr命令
应用实例
  1. 脚本开发,复杂的对用户输入判断的脚本开发

    该脚本开发,利用到了部分后期内容,涉及shell函数,if 判断逻辑

    脚本开发的思路

    • 想好脚本的功能,作用,以及需求

    • 转换为shell代码

      ###eg1,开发一个,接收用户输入的数字,且对运算符号判断,最终得出结果的一个计算脚本
      ##分析步骤
      #1.接收用户输入
      #2.对用户输入的是不是数字进行判断
      #3.对输入的运算符号进行判断
      #4.最终进行结果结算
      ###vim calculation.sh
      #!/bin/bash
      #脚本开发
      #函数的作用,就是把你写的功能代码,进行打包,封装成一个函数名,然后调用该函数名,函数就会执行
      #函数体中的代码就会执行
      print_usage(){
      echo "hello Peter"
      printf "Please enter an integer\n"
      #给脚本的执行结果,赋予一个状态码,退出码
      exit 1  ###程序结束并返回错误代码1
      }
      #接收用户输入命令,-p参数后面写给用户看到的提示信息
      #read -p  "提示信息" 接收用户收入的变量
      read  -p "Please input your number:  " firstnum
      #进行对用户输入判断,使用if语句
      #注意语法格式
      #限制用户必须输入存数字
      #中括号里面前后必须有一个空格 ,是固定写法 
      #-n  参数是if 的语句,对字符串判断,如果字符串为空,条件就不成立;如果字符串不为空,条件成立
      #如果用户录入abc123
      #sed的作用就是把上述的字符串"abc123"中的数字替换成空,就剩下非数字内容
      #如果输入的存数字123,则下面的if语句不成立,不执行函数。
      ##echo "录入值:${firstnum}"
      ##echo "录入值截取后:`echo ${firstnum} |sed 's/[0-9]//g'`"
      
      if [ -n "`echo ${firstnum}|sed 's/[0-9]//g'`" ]  ###注意-n后面必须加上""不加""时该if语句等效于if [ -n ],shell 会把它当成if [ str1 ]来处理,-n自然不为空;注意""不要带上空格类似 " `echo ${firstnum}|sed 's/[0-9]//g'` "否则也是会出问题,应该是估计空格也判定了长度自然也不为空
              then
              print_usage
      
      fi
      
      #上面的代码都是对用户输入的进行判断。
      #假设希望用户输入3+5这类
      #此时对运算符进行判断
      read -p "Please input your operator: " operator
      
      #对运算符进行判断
      #限制在+ - * /四个符号
      
      if [ ${operator} != "+" ]&& [ $operator != "-" ]&&[ $operator != "*" ]&& [ $operator != "/" ]
      then
              echo "只允许输入+|-|*|/"
              exit 2 ###程序结束并返回错误代码2
      fi
      
      #对第二个函数变量进行处理
      
      read -p "Please enter second number : " secondnum
      if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ]
              then
              print_usage
      
      fi
      
      #最后进行数字计算;用(())
      echo "$firstnum$operator$secondnum 结果是: $(($firstnum$operator$secondnum))"
                     
      
  2. 脚本开发案例2,检查网站服务是否能正常访问

    ###eg2检查网站服务是否能正常访问
    [root@localhost tmp]# cat checked.sh 
    #!/bin/bash
    #
    CheckUrl()
    {
    
    	#相当于计数器
    	timeout=5
    	fails=0
    	success=0
    	
    	#循环检测 ,循环执行命令
    	while true ###死循环
    		do
            sleep 1   ##睡眠1秒
    		# --tries 冲连机制, -q静默输出,-O /dev/null 结果写入黑洞文件
    		  wget --timeout=${timeout} --tries=1 http://baidu.com -q -O /dev/null
    		#echo $?
    		#if 条件 -ne 是不等于的意思
    		if [ $? -ne 0  ]
    			then
    			let fails=fails+1  #失败次数+1
    		else
    			let success=success+1
    		fi
    		#判断当成功次数大于等于1的时候,就可以的出网站正常访问
    		if [ $success -ge 1 ]
    		 then 
    			echo "恭喜,网站正常运行"
    			#返回一个状态玛, 0
    			exit 0
    		fi
    
    		##当错误次数大于2的时候,就告警;或法邮件
    		if [ ${fails} -ge 2 ] ;
    			then
    			#可自行扩展,发邮件,或短信的代码
    			echo "该网站一定三挂了,或在网络有问题"
    		        exit 2 #返回一个错误代码
    		fi
    		done
    
    }
    #注意函数定义后,一定要调用执行
    CheckUrl
    [root@localhost tmp]# sh checked.sh 
    恭喜,网站正常运行
    [root@localhost tmp]# sh checked.sh      ###断网后测试脚本
    该网站一定三挂了,或在网络有问题