shell02(条件测试、if分支和循环)

7 篇文章 0 订阅

运算

求模(求余数)

1.expr  可以运算并输出

         [root@svr7 ~]# expr 1 + 1    #加法运算,运算符号两边要加空格

                              ]# expr 2 - 1

                              ]# expr 2 '*' 2   # 使用单引号屏蔽*的特殊功能即可实现乘法

         [root@svr7 ~]# expr 2 \* 2    #使用转义符号屏蔽*的特殊功能
         [root@svr7 ~]# expr 4 / 2     #4除以2
         [root@svr7 ~]# expr 10 % 3   #取余数
       

       进行变量的运算

         [root@svr7 ~]# a=10
         [root@svr7 ~]# b=20
         [root@svr7 ~]# expr $a + $b
         [root@svr7 ~]# expr $a + 100
         [root@svr7 ~]# expr $a + $a

2.使用$[  ] 或者 $((  ))

        [root@svr7 ~]# echo $[1+1]
3.使用let命令,不显示结果,通常用于变量的创建于自增减

          功能一:let a=1+1         #变量的创建,然后可以用echo $a查结果

          功能二:对变量进行自增减

常规写法                   主流写法

  • let a=a+1                    let a++       变量的自增减,将变量a的值加1
  • let a=a-1                     let a--         变量a减1
  • let a=a+2                    let a+=2     变量a加2
  • let a=a-2                     let a-=2      变量a减2
  • let a=a*10                   let a*=10    变量a乘以10

4.使用bc计算器,可以进行小数运算

           [root@svr7 ~]# echo "1.1+1" | bc
           [root@svr7 ~]#echo "scale=3;10/3" | bc   #scale可以定义小数点后面的长度

条件测试  可以为脚本赋予智能判断的效果

          使用格式:1, test  表达式   2, [ 表达式 ]

          测试方式:

1.对字符串进行测试

      ==  判断两边是否相等      != 判断两边是否不等

           [root@svr7 ~]# test a == a

           [root@svr7 ~]# [ a == a ]

           [root@svr7 ~]# echo $?        #进行测试结果,输出0为正确,1为错误

           [root@svr7 ~]#   [ $a == $b ]  #使用变量判断两个变量的值是否相等

           [root@svr7 ~]#   [ $a != $b ]   #使用变量判断两个变量的值是否不相等

      -z  判断变量是否为空    !  -z  判断变量是否非空           -z判断是否为空(是空的话为0,因为是空的就会输出0) ! -z判断是否为非空(非空的话为0,因为是非空就输出0)

           [root@svr7 ~]# a=10

           [root@svr7 ~]#  [ -z $a ]     #判断变量a是否为空,如果为空则判断正确0

           [root@svr7 ~]#  [ ! -z $a ]   #判断变量a中是否有值,有值则判断正确0

2.逻辑符号

          &&  之前指令执行成功才会执行之后指令

           ||   之前指令执行失败才会执行之后指令

 [root@svr7 ~]# vim /opt/test01.sh

                    #!/bin/bash

                    [ $USER == root ] ||  exit     #如果用户不是管理员就退出

                    [ $USER != root ] &&  exit   #两种写法

                    yum -y install vsftpd     #安装ftp服务

                    systemctl restart vsftpd   #重启服务

                    systemctl enable vsftpd     #设置开机自启

 [root@svr7 ~]# vim /opt/test02.sh

                   #!/bin/bash

                   read -p "请输入用户名称:" n      #交互式创建用户

                   [  -z  $n  ]   &&   exit               #判断用户名为空的话就退出脚本

                   useradd $n

                   stty -echo            #屏蔽回显,输入任何信息都不会显示

                   read -p "请输入密码:" m     #交互式设置密码

                   echo 

                   stty echo      #恢复显示

                   echo "$m" | passwd --stdin $n           #将m设置为密码

使用多个逻辑符号

               [root@svr7 ~]# touch a b c   #创建三个文件

               [root@svr7 ~]# ls a  &&  ls b  &&  ls c  #结果是都显示,第一个ls执行成功,然后导致第二个ls也执行,

                                                                              并且可以成功,这样的话第一个和第二个任务都成功了,那么

                                                                              这个组合就算成功,然后会导致第二个逻辑符号&&后面的ls c 也执行并且成功。

                [root@svr7 ~]# ls a  ||  ls b  ||  ls c       # 结果是显示a,第一个ls执行成功,第二个ls就不会执行了,这

                                                                               两个任务中间是|| ,那么只要有一个成功就算这个组合执行成

                                                                               功,由于这个组合算成功,所以就不会执行第二个||后面的任务了

                  [root@svr7 ~]# ls a  &&  ls b  ||  ls c         #结果是显示a和b,第一个ls执行成功,然后导致第二个ls也

                                                                                     执行,并且可以成功,这样的话第一个和第二个任务都成功了,

                                                                                     那么这个组合就算成功,但是由于第二个逻辑符号是||,就不会

                                                                                     执行最后的ls c任务了ls a  ||   ls b  &&  ls c  //结果是显示a和c,

                                                                                     第一个ls执行成功,第二个ls就不会执行了,这两个任务中间是|| ,

                                                                                      那么只要有一个成功就算这个组合执行成功,所以就会导致第二个逻辑符号&&后面的ls c执行

更新脚本2

                  [root@svr7 ~]# vim /opt/test02.sh

                          #!/bin/bash

                          read -p "请输入用户名称:" n

                          [ -z $n ] && echo "你倒是给个名字阿!"   &&   exit     #退出前添加提示,没有用户名的情况下

                           useradd $n

                          stty -echo

                           read -p "请输入密码:" m

                           echo

                           stty echo

                           echo "$m" | passwd --stdin $n

3.数字

  • -eq 是否相等  
  • -ne 是否不等   
  • -gt 是否大于
  • -ge 是否大于等于  
  • -lt  是否小于
  •  -le  是否小于等于

  [root@svr7 ~]# [ 1 -eq 1 ]   #判断1是否等于1

  [root@svr7 ~]# [ 3 -ge 5 ]   #判断3是否大于等于5

  [root@svr7 ~]# a=10

  [root@svr7 ~]# b=20

[root@svr7 ~]# [ $a -ne $b ]  #判断变量a是否不等于变量b

4.文件

  • -e  判断文件是否存在,不关心类型
  • -f  判断文件是否存在,必须是普通文件
  • -d  判断文件是否存在,必须是目录
  • -r  判断当前用户对文件是否有读权限,对root无效
  • -w 判断当前用户对文件是否有写权限,对root无效
  • -x  判断当前用户对文件是否有执行权限(目录是否可以进入)

 

 

 

 

编写脚本,每2分钟检查服务器登录账户数量,如果超过3人发邮件通知管理员

  [root@svr7 ~]#vim test03.sh

                #!/bin/bash

                n=$(who | wc -l)    #n里面存储了登录数量

               [ $n -gt 3 ] && echo "服务器被入侵"  | mail -s test root         #用n和3对比,如果超过3就发邮件

 

  [root@svr7 ~]# chmod  +x  test01.sh   #脚本写完后,赋予x权限

  [root@svr7 ~]# crontab -e        #编写计划任务

                    */2  *  *  *  *  /opt/test01.sh    #每2分钟执行脚本,然后保存退出只要目前超过3人登录系统,那么每隔2分钟就会收到邮件,使用mail命令查看邮件

 

 

虽然&&和||可以实现逻辑组合,但如果情况比较复杂就可能需要n多个&&或者||,会导致脚本难写,可读性差。此时就可以使用if分支

 

三,if分支

  1. 单分支

        if 条件测试;then       #如果条件测试成功,那就执行下面的所有指令(指令可以有很多)

            执行指令    

        fi

  [root@svr7 ~]#vim /opt/test04.sh

          #!/bin/bash

          if [ $USER == root ];then

                echo "你是管理员~"

           fi

 

        2.双分支

          if 条件测试;then       #如果条件测试成功,就执行下面的所有指令(指令可以有很多)

                         执行指令

         else

                      执行指令      #如果上述条件测试失败,那就执行下面的指令

           fi

 

  [root@svr7 ~]#vim /opt/test04.sh             

               #!/bin/bash

               if  [ $USER == root ];then

                      echo "你是管理员~"

                else

               echo "你不是管理员~"

                fi

 

---------------------------------------------------

ping -c 定义ping的次数   -i 定义ping的间隔时间(秒)       -W  ping失败时多久反馈结果

---------------------------------------------------

[root@svr7 opt]# cat test05.sh

              #!/bin/bash

              ping -c 3 -i 0.2 -W 1 $1 &> /dev/null

               if [ $? -eq 0 ];then

                     echo "通了!"

              else

                     echo "不通!"

               fi

 

         3.多分支

                   if 条件测试;then      #如果条件测试成功,就执行下面的所有指令(指令可以有很多)

                   执行指令

                   elif 条件测试;then   //如果条件测试成功,就执行下面的指令

                              执行指令

                   elif 条件测试;then  //如果条件测试成功,就执行下面的指令

                              执行指令

                    .........

                    else

                              执行指令  //如果上述条件测试失败,那就执行下面的指令

                   fi

 

#!/bin/bash

read -p "期末考试成绩如何?"  n

if [ $n -ge 90 ];then

    echo "优秀!"

elif [ $n -ge 80 ];then

    echo "良好!"

elif [ $n -ge 60 ];then

    echo "及格!"

else

    echo "晚上没饭了!"

fi

 

-----------------------------------------------------------------

四,循环

有时我们需要某个或者某群任务反复在服务器中执行很多次,就可以使用循环命令写成脚本,而无需手工一次次执行

 

1.for循环,有次数的循环

for 变量名 in 值1 值2 值3 。。。。   #此处变量名可以自定义,通常习惯用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空格,这里是有3个值,所以就循环执行指令3次

do

    循环任务

done

--------------------------------

#!/bin/bash

for i in  {1..100}       #执行100次任务的简略写法,但不支持变量

do

    echo ${i}abc

done

 

----------------------------------

#!/bin/bash

a=100

for i in $(seq $a)       #使用seq支持变量

do

    echo ${i}abc

done

 

--------------------------------------------

编写脚本,用ping命令测试192.168.4.1~192.168.4.15是否可以通

 

#!/bin/bash

for i in {1..15}

do

    ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null

    if [ $? -eq 0 ];then

        echo "4.$i 通了!"

    else

        echo "4.$i 不通!"

    fi

done

-------------------------------------------

显示ping通的次数

#!/bin/bash

x=0

y=0

for i in {1..15}

do

    ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null

    if [ $? -eq 0 ];then

        echo "4.$i 通了!"

                   let x++

    else

        echo "4.$i 不通!"

                   let y++

    fi

done

echo "$x台通了,$y台不通"

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值