【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.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.5 判断文件

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

二、分支语句

2.1 if 分支

  • 单分支格式
if 条件测试 ; then
   指令序列
fi
  • 双分支格式
if 条件测试 ; then
   指令序列
else
   指令序列
  • 多分支格式
if   条件测试 ; then
     指令序列
elif 条件测试 ; then
     指令序列
     ......
else
     指令序列
fi
  • 综合练习
    检测并判断指定的主机是否可以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

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

2.2 case 分支

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

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

  • 案例
    编写脚本购买商品,薯片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元"

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

三、循环语句

3.1 for 循环

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

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

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

3.2 while 循环

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

3.3 终止循环

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

四、linux系统小知识充电站

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

         👆回到顶部👆

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值