Shell编程之条件语句(条件测试、if、case)

目录

1、条件测试

1.1文件测试

1.2整数数值比较

1.3字符串比较

1.4逻辑测试(短路运算)

2、if语句

2.1单分支

2.2双分支

2.3多分支语句

 3、case语句


1、条件测试

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成。

测试过程,实现评估布尔声明,以便用在条件性环境下进行执行

  • 若真,则状态码变量 $? 返回0
  • 若假,则状态码变量 $? 返回1

1.1文件测试

test 测试文件的表达式 是否成立

格式1:test [操作符选项] 条件表达式
格式2:[  [操作符] 条件表达式  ]

操作符作用
-d测试是否为目录
-e测试目录或文件是否存在
-f测试 指定的对象是否为文件;指定的文件是否存在
-L测试文件是否为符号链接(软链接文件)
-r测试 当前用户是否有读权限
-w测试 当前用户是否有写权限
-x测试 当前用户是否有执行权限
属性测试作用
-t fdfd 文件描述符是否在某终端已经打开
-s FILE是否存在且非空
-N FILE文件自从上一次被读取之后是否被修改过
-O FILE当前有效用户是否为文件属主
-G FILE当前有效用户是否为文件属组
  •  test [操作符选项] 条件表达式

  • [  [操作符] 条件表达式  ] 

1.2整数数值比较

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

  • -eq:等于(Equal)
  • -ne:不等于(Not Equal)
  • -gt:数大于(Greater Than)
  • -lt:小于(Lesser Than)
  • -le:小于或等于(Lesser or Equal)
  • -ge:大于或等于(Greater or Equal)

1.3字符串比较

格式:[ "字符串1" 操作符 "字符串2" ]

           [ -z "字符串" ] 是否为空

           [ -n "字符串" ] 字符是否存在

常用的测试操作符

  • =:字符串内容相同
  • !=:字符串内容不同,! 号表示相反的意思
  • -z:字符串内容为空
  • -n: 字符是否存在

1.4逻辑测试(短路运算)

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

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

常见条件

  • -a或&&:逻辑与,“而且”的意思全真才为真
  • -o或||:逻辑或,“或者”的意思一真即为真
  • !:逻辑否
[ 表达式1 ] && [ 表达式2 ] 等同于 [ 表达式1 -a 表达式2 ] 等同于 [[ 表达式1 && 表达式2 ]] 

[ 表达式1 ] || [ 表达式2 ] 等同于 [ 表达式1 -o 表达式2 ] 等同于 [[ 表达式1 || 表达式2 ]] 

三元运算符

[  表达式  ] && a || b

当条件表达式为真时,取a值;当条件表达式为假时,取b值

2、if语句

2.1单分支

与[ 表达式 ] && 效果相同

if [ 表达式 ];then
  ...
fi

例:磁盘使用率高于一定数值报警

[root@localhost ~]# df  //查询磁盘信息
文件系统                   1K-块    已用    可用 已用% 挂载点
/dev/mapper/centos-root 10475520 4616528 5858992   45% /
devtmpfs                  917588       0  917588    0% /dev
tmpfs                     933512       0  933512    0% /dev/shm
tmpfs                     933512   17472  916040    2% /run
tmpfs                     933512       0  933512    0% /sys/fs/cgroup
/dev/sda1                1038336  182388  855948   18% /boot
tmpfs                     186704       4  186700    1% /run/user/42
tmpfs                     186704      32  186672    1% /run/user/0
/dev/sr0                 4414592 4414592       0  100% /run/media/root/CentOS 7 x86_64

[root@localhost ~]# vim test.sh

#!/bin/ bash
#磁盘使用率高于一定数值报警

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

2.2双分支

与[ 表达式 ] && a || b效果相同

 if [ 表达式 ];then
   ...
 else
   ...
 fi

[root@localhost ~]# vim user.sh

#!/bin/bash
#判断是否为超级管理员
if [ "$USER" != "root" ]
then
  echo "非管理员用户无权限操作"
else
  echo "是管理员用户"
fi
[root@localhost ~]# bash user.sh
是管理员用户

2.3多分支语句

if [ 表达式 ];then
  ...
elif [ 表达式 ];then
  ...
elif [ 表达式 ];then
  ...
[else]

fi
[root@localhost ~]# vim grade.sh

#!/bin/bash
#考试分数在90-100为优秀,70-89为良好,60-69为合格,低于60为不合格
read -p "请输入你的考试分数:" grade

if [ $grade -ge 90 ] && [ $grade -le 100 ];then
  echo "你的成绩为$grade"
  echo "你的成绩为优秀"
elif [ $grade -ge 70 ] && [ $grade -le 89 ];then
   echo "你的成绩为$grade"
   echo "你的成绩为良好"
elif [ $grade -ge 60 ] && [ $grade -le 69 ];then
  echo "你的成绩为$grade"
  echo "你的成绩为合格" 
else
  echo "你的成绩为$grade"
  echo "你的成绩不合格"
fi
[root@localhost ~]# bash grade.sh 
请输入你的考试分数:66     
你的成绩为66
你的成绩为合格

 

 3、case语句

case支持glob风格的通配符:

  • * 任意长度任意字符
  • ? 任意单个字符
  • [0-9] 指定范围内的任意单个字符
  • |   或者,如: a|b
case 变量 in 
模式1)
  ....
  ;;

模式2)
  ....
  ;;
  
*)  
  ....
  ;;
esca  

例题

[root@localhost ~]# vim shuru.sh

#!/bin/bash
#输入yes或no中任意一个或多个字母的大小写都能识别为yes或n0
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 ~]# bash shuru.sh
请输入yes/no: y
你输入的是yes
[root@localhost ~]# bash shuru.sh
请输入yes/no: no
你输入的是no
[root@localhost ~]# bash shuru.sh
请输入yes/no: ni
shuru.sh:行11: echo你输入错误不是yes/no: 没有那个文件或目录
[root@localhost ~]# bash shuru.sh
请输入yes/no: mm
你输入错误不是yes/no

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值