Shell 编程之条件语句---条件测试、if语句和case分支语句

本文详细介绍了Shell脚本中的条件测试,包括test命令及其操作符,如文件测试、整数数值比较、字符串比较和逻辑测试。接着,讲解了if语句的不同分支(单分支、双分支、多分支)及其应用案例,以及case语句的使用方法。内容涵盖文件权限检查、数值比较、字符串操作、逻辑运算和多分支控制结构,适合Shell脚本初学者参考学习。
摘要由CSDN通过智能技术生成

1 条件测试

1.1 test 命令

测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值

格式1 :test [操作符选项] 条件表达式
格式2 :[操作符选项 条件表达式]   
#条件表达式的两边都需要有空格,否则会失败,且此方法更为常用
常见的测试操作符含义
-d测试是否为目录(Directory),指定的目录是否存在
-e测试目录或文件是否存在(Exist)
-f测试是否为文件(File),指定的文件是否存在
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有执行权限(excute)
-L测试文件是否为符号链接(软链接文件)
-nt判断文件A是否比文件B新
-ot判断文件A是否比文件B旧
-ef判断两个文件是否为同一文件

案例一:测试是否为目录
在这里插入图片描述
案例二
在这里插入图片描述

1.2 比较整数数值

格式: [整数变量1 操作符 整数变量2 ]
常用操作符说明
-eq等于(Equal)==
-ne不等于(Not Equal)!=
-lt小于(Leser Than)<
-gt大于(Greater Than)>
-le小于或等于(Lesser or Equal)<=
-ge大于或等于(Greater or Equal)>=

不建议使用==、!=、<、>、<=、>=,会出问题

案例一
在这里插入图片描述
案例二:查询用户数量是否大于1,如果大于,则进行提示
在这里插入图片描述
案例三
在这里插入图片描述

1.3 字符串比较

格式1:
[ "字符串1" = "字符串2" ] 或者 [ "字符串1 == 字符串2" ]			//判断是否相等
[ "字符串1" != "字符串2" ] 			//判断是否不等
格式2:
[ -z "字符串" ]              //-z:判断字符串内容是否为空或者指定的变量是否为空值
[ -n "字符串" ]              //-n:检查是否有字符串存在
注意:字符串要加""(冒号),不然会出问题
操作符含义
=字符串内容相同
!=字符串内容不同,!号表示相反的意思
-z字符串内容为空
-n检查是否有字符串存在

在这里插入图片描述
浮点数的运算

echo "浮点运算字符串" | bc
awk 'BEGIN{print 浮点运算字符串}'

在这里插入图片描述

1.4 逻辑测试

格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2
-a或&&逻辑与,而且的意思
-o或▕▕逻辑或,或者的意思
!逻辑否

&&:前面命令都执行成功后, 才执行最终结果
II:前面命令有一个为真,就可以执行最终结果
在这里插入图片描述
三元运算符

#java,c中
条件表达式?a:b:当条件表达式为真时,取a值;当条件表达式为假时,取b值
#shell中
[ 表达式 ] && a ll b:当条件表达式为真时,取a值;当条件表达式为假时,取b值

案例一

[root@localhost home]# [ -d /etc ] && [ -r /home ] && echo "you can open it"
[root@localhost home]# [ -d /etc ] || [ -L /home ] && echo "ok"

在这里插入图片描述
案例二

[root@localhost home]# [ 4 -lt 5 ] && echo true || echo false  //成立输出true,不成立输出false
[root@localhost home]# [ 4 -gt 5 ] && echo true || echo false

在这里插入图片描述

2 if 语句

2.1 单分支

只要满足“相对应的条件”,便可执行后面的命令

if [ 条件判断 ]     //当条件判断成立时,执行一条或多条命令
  then 
      命令
fi
或者[ 表达式 ] && a

在这里插入图片描述
案例一

#!/bin/bash
if [ 3 -gt 2 ]
  then
    echo "3大于2"
fi

在这里插入图片描述
案例二:查看 MOUNT 有没有这个目录,没有就创建一个
在这里插入图片描述

2.2 双分支

针对"条件成立" "条件不成立"两种情况,分别执行相应的代码
在同一个数据的判断中,如果该数据需要进行两种不同的判断,我们就需要双分支if语句

if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
else	
	当条件判断不成立时,可以执行一条或多条命令
fi 		

在这里插入图片描述
案例一:判断你是否系统重启

[root@localhost data]# vim reboot.sh

#!/bin/bash
read -p "请输入yes确定重启:" test
if [ $tset = "yes" ]
   then
      echo "系统重启"
else
    else "没有输入yes,系统将不重启"
fi

在这里插入图片描述
在这里插入图片描述
案例二:判断 ping 命令检测主机结果

方法一

[root@localhost data]# vim ping.sh

#!/bin/bash
ping -c3 -i 0.2 -W1 192.168.16.16 &>/dev/null
if [ $? -eq 0 ];then
   echo "host 101 is online"
else
   echo "host 101 is down"
fi  

在这里插入图片描述
方法二

#!/bin/bash
#用if语句判断主机是否存活
read -p "请输入主机IP:" i
ping -c3 -i 0.2 -W1 $i &> /dev/null
#-C:只发送三个测试包  -i:间隔0.2秒  -W:超时1秒(W要大写)
if [ $? -eq 0 ];then
   echo "主机存活"
else
   echo "主机不存活"
#判断ping命令的检测结果,分别给出不同提示
fi 

在这里插入图片描述
案例三:判断当前用户是否是 root
在这里插入图片描述
在这里插入图片描述
案例四:磁盘空间

[root@localhost data]# vim for13.sh
#!/bin/bash

USED=$(df | grep /dev/sda1 | awk '{print $5}' | awk -F '%' '{print $1}')
if [ $USED -gt 5 ];then
  echo "警告!当前 / 目录的磁盘使用率为 ${USED}%"
fi

2.3 多分支

嵌套使用,进行多次判断

if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
	当条件判断成立时,可以执行一条或多条命令
else	
	当上面的条件判断都不成立时,可以执行一条或多条命令
fi 		

在这里插入图片描述
案例一:判断分数范围,分出优秀、合格、不合格三种

#!/bin/bash
read -p "请输入你的分数(0-100):" num
if [ $num -ge 90 -a $num -le 100 ];then
   echo "优秀"
elif [ $num -ge 70 -a $num -le 89 ];then
   echo "良好"
elif [ $num -ge 60 -a $num -le 69 ];then
   echo "合格"
elif [ $num -ge 0 -a $num -le 59 ];then
   echo "不合格"
else
   echo "输入有误,请重新输入0-100的正整数"
fi

在这里插入图片描述
在这里插入图片描述

[root@localhost data]# vim case1.sh

#!/bin/bash
read -p "请输入你的分数:(0-100)" num
[ $num -eq 100 ] && a="A"
[[ $num -ge 80 && $num -le 99 ]] && a="B"
[[ $num -ge 60 && $num -le 79 ]] && a="C"
[[ $num -ge 0 && $num -le 59 ]] && a="D"

case $a in
A)
  echo "恭喜你!获得$num分"
;;
B)
  echo "秀儿!获得$num分"
;;
C)
  echo "继续努力!获得$num分"
;;
D)
  echo "请卷起来!获得$num分"
;;
esac

在这里插入图片描述
在这里插入图片描述

案例二:判断现在的时间是上午、下午、晚上还是其他时间,并输出早上好、中午好、晚上好还是休息时间

[root@localhost ~]# vim time.sh

#!/bin/bash
Time=$(date +%H)
if [ $Time -ge 6 -a $Time -le 10 ]
  then
  echo "早上好"
elif [ $Time -ge 11 ] && [ $Time -le 13 ]
  then
  echo "中午好"
elif [ $Time -ge 14 ] && [ $Time -le 18 ]
  then
  echo "下午好"
elif [ $Time -ge 19 ] && [ $Time -le 23 ]
  then
  echo "晚上好"
else
  echo "休息时间"
fi

在这里插入图片描述
在这里插入图片描述

2.4 if 的综合案例

案例一:检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限

#!/bin/bash
if [ -f $HOME/test.sh ];then
#-f 是否为文件(File),指定的文件是否存在
#-x 测试当前用户是否有执行权限
  echo "文件存在"
  if [ -x ~/test.sh ];then
    echo "文件有权限"
  else
    echo "文件没有执行权限"
  fi
else
  echo "文件不存在"
fi

在这里插入图片描述
案例二:提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误

#!/bin/bash
read -p "请输入100米赛跑的秒数(0-100):" second
if [ $second -gt 0 ] && [ $second -le 10 ];then
  echo "恭喜你,进入选拔赛,成绩为:" $secondread -p "请输入你得性别(男/女):" sex
        if [ $sex = '男' ];then
          echo "你进入男生组!"
        elif [ $sex = '女' ];then
          echo "你进入女生组!"
        else
          echo "输入有误,请重新输入(男/女)"
        fi
elif [ $second -gt 10 ] && [ $second -le 100 ];then
  echo "很遗憾,你被淘汰了,成绩为:" $secondelse
   echo "输入有误,请重新输入(0-100)"
   bash $0
fi

3 case语句

case 行首必须以单词 “in”,每一模式必须以单个右括号 “)” 结束
双分号 “;;” 表示命令序列的结束
模式字符串中,可以用方括号表示一个连续的范围,如 “[0-9]”;还可以使用竖杠 | 表示或,比如 a|b
最后的)表示默认模式,其中的相当于通配符

格式:
case 变量名称 in
模式1)
	命令序列
    ;;
模式2)
	程序段
	;;
*)   //不包含第一个变量内容与第二个变量内容的其他程序执行段
	默认程序段
	;;
esac

在这里插入图片描述
模式:可以是具体的数值,也可以是范围
如果是范围支持通配符

*任意字符任意条件
?任意单个字符
[0-9]单个数字
或者

当变量值有多个数值的情况,可以使用case模式中的数字只能写[0-9],
例:1[0-9]:表示10-19
案例一:输入一个分数,判断是优秀,良好,及格,不及格

[root@localhost ~]# vim case.sh

#!/bin/bash
read -p "请输入你的分数(0-100):" score
  case $score in
  100)
    echo "优秀"
    ;;
  [8-9][0-9])
    echo "良好"
    ;;
  [6-7][0-9])
    echo "及格"
    ;;
  [0-9]|[1-5][0-9])
    echo "不及格"
    ;;

  *)
  echo "输入有误,请输入0-100"
  bash $0
  esac

在这里插入图片描述
在这里插入图片描述
案例二:输入你想连接的服务器,判断是否通

[root@localhost ~]# vim case1.sh

#!/bin/bash
web1="192.168.16.16"
mysql="192.168.16.17"
docker="192.168.16.18"

cat <<EOF
1 web1
2 mysql
3 docker
EOF

read -p "请输入你想连接的服务器(1-3):" host
case $host in
1)
  ssh $web1
  ;;
2)
  ssh $mysql
  ;;
3)
  ssh $docker
  ;;
*)
  echo "输入有误,请重新输入1-3"
  bash $0
  ;;
esac

在这里插入图片描述
在这里插入图片描述
案例三:输入一个月份,判断在一年那个季度

[root@localhost ~]# vim case2.sh

#!/bin/bash
read -p "请输入月份:" yue
case $yue in
[1-3])
  echo "第一季度";;
[4-6])
  echo "第二季度";;
[7-9])
  echo "第三季度";;
1[0-2])
  echo "第四季度";;
*)
  echo "输入错误"
esac

在这里插入图片描述
在这里插入图片描述
案例四:输入 yes/no

[root@localhost ~]# vim case3.sh

#!/bin/bash
read -p "请输入yes/no:" key
case $key in
[nN]|[nN][oO])
  echo "你输入的是no"
  ;;
[Yy]|[Yy][eE][Ss])
  echo "你输入的是yes"
  ;;
*)
  echo "你输入错误,不是yes/no"
esac

在这里插入图片描述
在这里插入图片描述
案例五:输入一个字符,判断是数字、字母还是其他字符

[root@localhost ~]# vim case4.sh

#!/bin/bash
#匹配 数字 字母 其他字符

read -p "请输入一个字符:" key
case $key in
[0-9])
  echo "你输入的是数字"
  ;;
[a-z][A-Z])
  echo "你输入的是字母"
  ;;
*)
  echo "你输入的是其他字符"
esac

在这里插入图片描述
在这里插入图片描述

4 总结

1、测试
测试分为文件测试、字符测试、数字测试

格式1 :test 条件表达式
格式2 :[条件表达式]   
常见的测试操作符含义
-d测试是否为目录(Directory)
-e测试目录或文件是否存在(Exist)
-f测试是否为文件(File)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有权限执行(excute)

2、if 语句
单分支

if [ 条件判断 ]     //当条件判断成立时,执行一条或多条命令
  then 
      命令
fi

双分支

if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
else	
	当条件判断不成立时,可以执行一条或多条命令
fi 		

多分支

if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
	当条件判断成立时,可以执行一条或多条命令
else	
	当上面的条件判断都不成立时,可以执行一条或多条命令
fi 		

3、case 语句

格式:
case 变量名称 in
模式1)
	命令序列
    ;;
模式2)
	程序段
	;;
*)   //不包含第一个变量内容与第二个变量内容的其他程序执行段
	默认程序段
	;;
esac

5 Shell 脚本小游戏:石头剪刀布

方法一:用 if 语句

[root@localhost data]# vim if1.sh

#!/bin/bash
key=$[RANDOM%3+1]
#1:包子   2:剪刀  3:锤子
read -p "请输入1包子,2剪刀,3锤子:" num
if [ $num -eq $key ]
then
  echo "打成平局"
elif [ $num -eq 1 ] && [ $key -eq 2 ]
then
  echo "机器胜利"
#人类是num,机器是key
elif [ $num -eq 1 ] && [ $key -eq 3 ]
then
  echo "人类胜利"
elif [ $num -eq 2 ] && [ $key -eq 1 ]
then
  echo "人类胜利"
elif [ $num -eq 2 ] && [ $key -eq 3 ]
then
  echo "机器胜利"
elif [ $num -eq 3 ] && [ $key -eq 1 ]
then
  echo "机器胜利"
elif [ $num -eq 3 ] && [ $key -eq 2 ]
then
  echo "人类胜利"
else
  echo "请按要求输入1-3"
fi

在这里插入图片描述
在这里插入图片描述方法二:if 和 case 语句结合
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值