shell脚本条件语句

shell编程之条件语句

一.条件测试

1.1文件测试

1.1.1test命令及格式
test命令
#测试表达式是否成立,若成立返回0,否则返回其他数值

格式1:[ 条件表达式 ]

例如:
test -e 123.txt
  echo $?
test -d ff
  echo $?
test -f 123.txt
  echo $?

在这里插入图片描述

格式2:test 条件表达式

[ -f 123.txt ]
echo $?

1.1.2文件测试

格式:[ 整数1 操作符 整数2 ]

-d:测试是否为目录
-e:测试目录或文件是否存在
-f:测试是否为文件
-r:测试当前用户是否有权限读取
-w:测试当前用户是否有权限写入
-x:测试当前用户是否有权限执行

1.2整数值比较

1.2.1整数值比较格式
整数1 操作符 整数2 
1.2.2常用的测试操作符
  • 只能用于整数比较
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-le:小于或等于
-ge:大于或等于
-z:检查字符串是否为空
-n:检查字符串是否存在
test 2 -ge 1
echo $?
0
[ 2 -eq 1 ]
echo $?
1

在这里插入图片描述

vim test.sh
#!/bin/bash                          
word=" "
if [ -z "$word" ]
then
 echo "空字符串"
else
 echo "字符串不为空"
fi
结果:sh test.sh 
字符串不为空————————空格也是字符串
vim test.sh
#!/bin/bash
word=""
if [ -z "$word" ]
then
 echo "空字符串"
else
 echo "字符串不为空"
fi
结果:sh test.sh 
空字符串
vim test.sh
#!/bin/bash
word="hello!"
if [ -n "$word" ]
then
 echo "字符串存在"
else
 echo "字符串不存在"
fi
结果:sh test.sh 
字符串存在
  • 可以整数也可以字符串比较
==:等于
!=:不等于
>:大于
<:小于
<=:小于等于
>=:大于等于
  • 检查脚本
bash -n 脚本名称(不在当前目录下加绝对路径)——————————检查语法错误
bash -x 脚本名称(不在当前目录下加绝对路径)——————————检查逻辑错误

1.3字符串比较

1.3.1字符串比较格式

格式1:[ 字符串1 = 字符串2 ]

在这里插入图片描述

[ 字符串1 != 字符串2 ]

- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUbGk8DN-1685444646131)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230526190245040.png)]

1.2逻辑测试

1.2.1逻辑测试格式

格式1:[ 表达式1 ] 操作符 [ 表达式2 ]…

格式2:命令1 操作符 命令2 …

1.2.2逻辑测试常用的操作符

逻辑关系表达格式注解
逻辑且-a或&&前后两个条件都要成立
逻辑或-o或||前后条件成立一个即可
逻辑否否定
1.2.3具体操作
  • 逻辑且
[root@test2 opt]# a=5
[root@test2 opt]# [ $a -ne 1 ] && [ $a != 2 ]——————a不等于1 并且a 不等于2
[root@test2 opt]# echo $?
0
[root@test2 opt]# [ $a -ne 1 -a $a != 2 ]
[root@test2 opt]# echo $?
0

  • 逻辑或
[root@test2 opt]# [ $a -ne 1 ] || [ $a -le 4 ]
[root@test2 opt]# echo $?
0
[root@test2 opt]# [ $a -ne 1 -o $a -le 4 ]————————a不等于1或a小于等于4
[root@test2 opt]# echo $?
0
[root@test2 opt]# 
  • 逻辑非
[root@test2 opt]# a=5
[root@test2 opt]# [ ! $a -eq 5 ]————————————————取反,否定a=5 但a本身就是5
[root@test2 opt]# echo $?
1
  • [[ ]]适用于更复杂的,支持正则表达式,功能更强大,可以不用使用双引号
  • [ ]进行表达式测试,引用变量,要加引号
[root@test2 opt]# a=5
[root@test2 opt]# [[ $a != 1 && $a != 5 ]]
[root@test2 opt]# echo $?
1
[root@test2 opt]# b=1
[root@test2 opt]# [ "$b" -eq 1 ]
[root@test2 opt]# echo $?
0

二.if 语句

1.if单分支语句

1.1单分支语句结构
if 条件测试操作
  then 命令序列
fi

在这里插入图片描述

1.2单分支语练习
vim test.sh 
#!/bin/bash
if [ 3 -ge 2 ]
then
 echo "ok"
fi
结果:
sh test.sh 
ok

2.if双分支语句

2.1双分支语句结构
if 条件测试操作
 then 命令序列1
 else 命令序列2
fi

在这里插入图片描述

2.2双分支语句练习
#!/bin/bash
if [ 3 -ge 4 ]
then
 echo "ok"
else
echo "no ok"
fi
结果: sh test.sh 
no ok

3.if多分支语句

3.1多分支语句结构
if 条件测试操作1
 then 命令序列1
elif 条件测试操作2
 then 命令序列2
else
 命令序列3
fi

在这里插入图片描述

3.2双分支语句练习
vim test1.sh
#90-100 优秀
#70-89 一般
#60-69 加油
#0-59 努力
#过滤掉非法输入,非整数,要有提示,输入错误,并且不执行!
read -p "请输入成绩:" score
if [ $score -eq $score ]
then
 echo "输入正确!"
 if [ $score -ge 90 ] && [ $score -le 100 ]
   then
    echo "优秀"
 elif [ $score -ge 70 ] && [ $score -le 89 ]
   then
    echo "一般"
 elif [ $score -ge 60 ] && [ $score -le 69 ]
   then
    echo "加油"
 else
    echo "努力"
 fi
else
 echo "输入错误!"
fi

结果:

在这里插入图片描述

三.case分支语句

1.case多分支结构

case 变量值 in
模式1)
  命令序列1
  ;;
模式2)
  命令序列2
  ;;
  ......
*)
  默认命令序列
esac

在这里插入图片描述

2.case多分支练习

read -p "请输入成绩:" score
[[ $score -ge 90 && $score -le 100 ]] && a="good"
[[ $score -ge 70 && $score -le 89 ]] && a="same"
[[ $score -ge 60 && $score -le 69 ]] && a="bad"
case $a in
good)
 echo "${a}分,优秀"
;;
sane)
 echo "${a}分,一般"
;;
bad)
 echo "${a}分,加油" 
;;
*)
 echo "努力"
esac

结果:

在这里插入图片描述

四.拓展

  1. 检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
test -f /root/test.sh
if [ $? -eq 0 ]
then
 echo "文件存在"
 test -x /root/test.sh
   if [ $? -eq 0 ]
    then    
      echo "有执行功能"
    else    
      echo "没有执行功能"     
    fi     
else
 echo "文件不存在"
fi    

结果输出:

在这里插入图片描述

2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,
如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误

read -p "请输入100m赛跑的秒数:" num
if [ $num -gt 0 -a $num -le 10 ]
then
 echo "进入选拔赛"
 read -p "请输入性别: " sex
  if [ $sex == 男 ]
   then
   echo "进入男生组"
  elif [ $sex == 女 ]
   then
   echo "进入女生组"
  else
   echo "输入错误"
  fi
elif [ $num -gt 10 ]
 then
  echo "淘汰"
else
  echo "请重新输入"
fi

结果输出:

在这里插入图片描述

3.用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录

read -p "请输入压缩包类型: " type
[[ $type == *.tar.gz ]] && a="*jie"
[[ $type == *.tar.bz2 ]] && a="*jy1"
case $a in
*jie)
tar -zxvf $type -C /opt
 echo "解压成功"
;;
*jy1)
tar -jxvf $type -C /opt
 echo "解压成功"
;;
*)
esac

结果输出:

在这里插入图片描述

4.提示用户输入内容,使用if 语句判断输入的内容是否为整数。

read -p "请输入内容:" word
if [ $word -eq $word ] &> /dev/null
then
 echo "整数"
else
 echo "不是整数"
fi

结果输出:

在这里插入图片描述

5.根据第6题再判断输入的内容是奇数还是偶数。

read -p "请输入内容:" word
if [ $word -eq $word ] &> /dev/null
then
 echo "整数"
 let i=$word%2
   if [ $i -eq 0 ]
   then
     echo "偶数"
   else
     echo "奇数"
 fi
else
 echo "不是整数"
fi

结果输出:
在这里插入图片描述

6.用if 语句判断主机是否存活

read -p "请输入一个iP地址: " ip
ping -c 3 $ip
if [ $? -eq 0 ]
then
 echo "$ip online"
else
 echo "$ip is offonline"
fi

结果输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8SSkg36Z-1685444646134)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230526230053083.png)]

7.用case语句在/etc/init.d/目录中写一个firewalld脚本,使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务,要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。

read -p "请输入想要执行的服务:" service
[[ $service == "start" ]] && a="start"
[[ $service == "stop" ]] && a="stop"
[[ $service == "restart" ]] && a="restart"
[[ $service == "status" ]] && a="status"
case $a in
start)
systemctl start firewalld
 echo " 开启防火墙"
;;
stop)
systemctl stop firewalld
 echo " 关闭防火墙"
;;
restart)
systemctl restart firewalld
 echo " 重启防火墙"
;;
status)
systemctl status firewalld
 echo " 查看防火墙状态"
;;
*)
 echo "$0 {start|stop|status|restart}"     
esac

结果输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDujbij7-1685444646135)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230526230350962.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值