shell脚本条件测试,if,case判断语句

253 阅读3分钟

一.shell条件测试语句

1.1 test命令

数据如果判断为真,返回0,如果为假,为非0

  • test [操作符选项] 表达式
  • [ 操作符选项 表达式 ]

1.2 文件测试

文件测试常见选项

选项作用
-d测试指定对象是否为目录:指定的目录是否存在
-e测试目录或文件是否存在
-f测试指定对象是否为文件:制定的文件是否存在
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有权限执行(eXcute)
-L测试是否为符号链接(软链接文件)

实例:

image-20220407230729128

1.3 整数值测试

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

整数值比较常用操作符

文字操作符符号操作符含义
-eq等于(Equal)
-ne不等于(Not Equal)
-lt小于(Leser Than)
-gt大于(Greater Than)
-le小于或等于(Lesser or Equal)
-ge大于或等于(Greater or Equal)

表达式可以用数字来表示,也可以用变量来表示对比

实例:

[root@localhost ~]# [ 10 -gt 20 ]
#10是否大于20
[root@localhost ~]# echo $?
1
#返回1,表示错误
[root@localhost ~]# a=10
[root@localhost ~]# b=20
#定义变量ab的变量值为数字
[root@localhost ~]# [ $a -lt $b ]
#$a的数值是否小于$b
[root@localhost ~]# echo $?
0

1.4 字符串比较

格式:
[ 字符串1 = 字符串2 ] 			#判断是否相等
[ 字符串1 != 字符串2 ] 			#判断是否不等
[ -z 字符串 ]                     #判断字符串内容是否为空

操作符

操作符含义
=字符串内容相同
!=字符串内容不同,!号表示相反的意思
-z字符串内容为空

实例

判断当前系统语言环境是否为“us.en”,如果不是则提示

[root@localhost ~]#echo $LANG
zh_CN.UTF-8
[root@localhost ~]#test `echo $LANG`="us.en"&&echo \
#当前系统语言不是us.en,当前系统语言为`echo $LANG`
当前系统语言不是us.en,当前系统语言为zh_CN.UTF-8
[root@localhost ~]#

1.5 逻辑测试

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

操作符:

-a或&&and前后条件都要成立
-o或▕▕or只需前后条件中一个成立
逻辑否

多种表达方法

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

三元运算符

顾名思义,三元如名字表示的三元运算符需要三个操作数。

当条件表达式为真时,取a值;当条件表达式为假时,取b值
#表达方式如下
[ 表达式 ] && a || b

实例

[root@localhost ~]# cat ping.sh
#!/bin/bash
ping -c3 $1 &>/dev/null && echo "host online" || echo "host down"
[root@localhost ~]# ./ping.sh 192.168.159.100
host down
[root@localhost ~]# ./ping.sh 192.168.159.101
host online

image-20220408012454181

二 if语句

2.1.1 单分支结构

if语句需要逐层盘点,执行相对较慢,在编写过程中,如果在if then语句结束后,没有其他默认值,可以省略else

格式
格式:

1. if [ 条件判断式 ]; than
2. ​	当条件判断成立时,执行一条或多条命令
3. fi 			
实例
[root@localhost ~]#if test -e data; then echo "文件存在"; fi

文件存在

[root@localhost ~]#

2.1.2 双分支结构

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

测试httpd服务是否安装并开启脚本,如果没有,实现自动安装并开启(使用了if脚本嵌套)

#!/bin/bash

netstat -ntap | grep :80 &> /dev/null
#检测80端口是否开启,并将print信息导入黑洞中
if  [ $? -eq 0 ]
#如果80端口返回0,也就是启动成功
then
#
  echo "网站服务正在运行"
  #print 网站正在运行
else
#如果不是

#下面是在if语句中嵌套if语句
        if rpm -q httpd &> /dev/null
        #如果已经按安装httpd服务
        then
        #则输出httpd正在启动
          echo "正在启动httpd服务"
          systemctl start httpd
          #执行httpd启动命令
        else
        #如果没有
          echo "正在安装并启动httpd服务"
          yum install -y httpd &> /dev/null && systemctl start httpd &> /dev/ null
          #则安装httpd并且启动
        fi

fi

image-20220408105511091

2.1.3 多分支结构

格式
if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
	当条件判断成立时,可以执行一条或多条命令
...(可以使用多次)
else	
	当上面的条件判断都不成立时,可以执行一条或多条命令
fi 		
实例

根据分数情况给评价

[root@localhost ~]# cat ifjisuanqi.sh
#!/bin/bash

read -p "请输入您的分数(1-100):" num
   if [ $num -ge 85 ] && [ $num -le 100 ]
then
   echo "$num分,优秀!!!"

   elif [ $num -ge 70 ] && [ $num -le 84]
then
   echo"$num分,合格!"


   else
   ehco"$num分,不合格"


fi

image-20220408112704837

三 case语句

image-20220408113306401

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

注意点:

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

使用case语句配合正则表达式判断分数情况

#!/bin/bash

read -p "请输入您的分数(0-100)"  num
case $num in

100)
  echo "恭喜您,获得$num 分"

;;

[89][0-9])
  echo "获得 $num 分,优秀"

;;

[67][0-9])
  echo "继续努力,获得 $num 分"
;;

[0-9]|[1-5][0-9])
  echo "成绩不佳,获得 $num 分"

;;

*)
  echo "输入有误"
esac
~

image-20220408130141318

习题

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

方法1

[root@localhost ~]# [ -d ~/test.sh ] && echo "文件存在" ||echo "文件不存在"
文件不存在
[root@localhost ~]# [ -x ~/test.sh ] && echo "可执行" ||echo "不可执行"
不可执行

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

#!/bin/bash

read -p "请输入时间成绩[0-10]:" pao

if [ $pao -gt 0 ] && [ $pao -le 10 ]
then
  echo "成功晋级选拔赛"
read -p "请输入性别:"  xb

    if [ $xb = "男" ];
    then
      echo "男生组"

    elif [ $xb = "女" ];
    then
      echo "女生组"

    else
      echo "输入错误"
    fi

elif [ $pao -gt 10 ];
then
  echo "淘汰"

else
  echo "重新输入"
fi