• 【Shell篇<Ⅰ>】——条件测试、分支、循环


    让我们进入今天的学习吧!
    💪Keep  trying💪

    在这里插入图片描述

    一、条件测试

    1.1 语法格式

    • test 表达式
      如:test 2 = 2 ,可以用echo $?查看条件测试的结果。
      test表达式中空格要严格空出来,否则有语法错误
      在这里插入图片描述

    • [ 表达式 ]
      如:[ 2 = 3 ]
      这里中括号里面的空格也要严格空出来。
      在这里插入图片描述

    1.2 判断字符串

    • == 和 !=
    • 注意:在用条件测试时,如果变量为空,那么就会报语法错误,看下图
      在这里插入图片描述
      而当变量为空时,我们并不想让它报错,直接判断不相等就可以了。为了避免这种情况,有两种解决方法
      • 给变量加双引号
        在这里插入图片描述

      • 先判断一下变量是否为空
        -z 判断,变量为空则表达式正确;
        ! -z,变量不为空则表达式正确
        在这里插入图片描述

    1.3 逻辑组合

    • 格式

      • a && b:a成功则执行b,a和b同时成功,a&&b才算成功
        在这里插入图片描述
      • a || b:a失败则执行b,a和b有一条成功,a || b就算成功
        在这里插入图片描述
    • 多逻辑组合

      • a && b && c
        c是否执行,得看a && b是否成,a和b同时成功才能算成功
      • a || b && c
        c是否执行,得看a || b是否成功,a和b有一个成功就算成功
    • 综合案例
      编写一个脚本,判断当前用户是否是root,如果不是,则输出“您不是root”,然后退出脚本程序

    #!/bin/bash
    [ $USER != root ] && echo "您不是root" && exit
    
    • 1
    • 2

    1.4 数字的条件测试

    • -eq(Equal):相等
      -ne(Not Equal):不等
      -ge(Greater or Equal):大于等于
      -le(Less or Equal):小于等于
      -gt(Greater Than):大于
      -lt(Less Than):小于
      在这里插入图片描述
      注意:2 == 2 实质上是将2作为字符在判断(这里有没有做隐式类型转换,等我考证了再来改,应该是做了),而 2 -eq 2 才是将2作为数值在判断。

    1.6 综合案例
    如果用户数量发生变化,则发送警告消息给root,假设当前系统用户数量为30人。

    #!/bin/bash
    x = $(cat /etc/password | wc -l) #当前用户的数量
    [ x -ne 30 ] && echo "用户数量变化,服务器可能被入侵" | mail -s "警告" root
    
    • 1
    • 2
    • 3

    1.5 判断文件

    • -e:判断文件是否存在,不关心类型
      -f:判断文件是否存在,必须是普通文件
      -d:判断文件是否存在,必须是目录
      -r:判断当前用户对文件是否有读权限,对root无效
      在这里插入图片描述
      -w:判断当前用户对文件是否有写权限,对root无效
      -x:判断当前用户对文件是否有x权限

    二、分支语句

    2.1 if 分支

    • 单分支格式
    if 条件测试 ; then
       指令序列
    fi
    
    • 1
    • 2
    • 3
    • 双分支格式
    if 条件测试 ; then
       指令序列
    else
       指令序列
    
    • 1
    • 2
    • 3
    • 4
    • 多分支格式
    if   条件测试 ; then
         指令序列
    elif 条件测试 ; then
         指令序列
         ......
    else
         指令序列
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 综合练习
      检测并判断指定的主机是否可以ping通
    #!/bin/bash
    ping -c 2 -i 0.2 -W 1 $1 &> /dev/null
    if test $? -eq 0 ; then
        echo $1 PONG
    else
        echo $1 DOWN
    fi
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    脚本执行结果为(192.168.88.88为本机IP):
    在这里插入图片描述

    2.2 case 分支

    • 按照预设的值进行匹配,如果匹配成功,则进入值对应的区域执行指令,如果都不匹配,则进入默认的区域执行指令。
    • 格式
    case 变量 in
    变量值1)
    	命令序列
    	......
    	命令序列;;
    变量值2)
    	命令序列
    	......
    	命令序列;;
    ......
    *)
    	默认命令序列
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意:除了默认的命令序列最后不加双分号,其他的命令序列最后都要加双分号

    • 案例
      编写脚本购买商品,薯片5元,可乐3元,方便面2元,您有10元钱,购买完后显示余额。
    #!/bin/bash
    money=10
    read -p "请输入商品编号[1.薯片¥5   2.可乐¥3   3.方便面¥2] : " num
    case $num in
    1)
      let money-=5;;
    2)
      let money-=3;;
    3)
      let money-=2;;
    *)
      echo "输入有误!"
    esac
    echo "本次花费$((10-money))元, 余额$money元"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    脚本运行结果为:
    在这里插入图片描述

    三、循环语句

    3.1 for 循环

    • 格式
    for 变量 in 值1 值2 ......
    do
    	指令序列             #前面空不空格都无所谓
    down
    
    • 1
    • 2
    • 3
    • 4

    这里的值列表可以有多种玩法

    • {1…100} 等同于1 2 3 4 … 100
      系统在执行这种指令时,会将这个指令先展开。但是,这种写法不支持变量,看下面的例子
      在这里插入图片描述
      可以看到,当引入变量的时候,输出并不尽人意。这是为什么呢?因为系统在执行这条指令时,本来只需要展开就可以了,但现在需要先将变量a进行替换,好家伙,结果它就只做了变量替换,不展开了,所以直接把后面的 {1..$a} 当成一个变量处理了。
    • 为了解决上面的问题,我们可以用 seq 命令
      seq + 数字(变量), 也可以起到展开的效果。
      但是 seq 和 for 结合使用时,需要将seq的式子用反撇号或者 $() 括起来,这样for循环才能识别
      在这里插入图片描述

    3.2 while 循环

    • while循环适用于循环次数未知的情况
    • 格式
    while 条件测试  # 如果这里写 while :  代表死循环
    do
    	命令序列
    done
    
    • 1
    • 2
    • 3
    • 4

    3.3 终止循环

    • exit:直接退出脚本程序
    • break:退出整个循环
    • continue:退出本次循环,继续下一轮循环

    四、linux系统小知识充电站

    • netstat -ntulp 或者 ss -ntulp 可以查询系统的端口信息
    • grep -q选项,过滤之后不显示任何信息
    • 预定义变量 $?, 只会对上一条的命令做判断,不会判断重定向的操作
    • 给输出的字体改颜色
    echo -e "\033[31mxxxxx\033[0m"
    # 31m为颜色代号,xxxxx为输出内容,\033[ 为格式,最后的\033[0m 是为了将颜色恢复
    
    • 1
    • 2
    • ping的选项
      -c:指定ping几个包
      -i:定义ping的时间间隔(s)
      -W:ping失败后等待几秒反馈结果

             👆回到顶部👆

    在这里插入图片描述

  • 相关阅读:
    类继承关系梳理
    invalid use of incomplete type ‘class Ui::xxx‘
    net基于asp.net的警院学生奖励管理系统-计算机毕业设计
    计算机网络总结笔记
    大学物理·第7章恒定磁场
    软考和 PMP 哪个含金量更高点?
    如何保持电机安全运行
    Easyx图片操作
    【Azure API 管理】API Management如何有效且快速更新呢?如对APIs/Policy等设置内容
    flutter_gen依赖
  • 原文地址:https://blog.csdn.net/qq_41890240/article/details/126444616