Shell编程之条件语句

文章目录

前言

之前对shell脚本的基础理念进行了了解,但是那种简单的编写明显达不到自动化的需求,所以这次就在上一章的基础上进行学习关于语句的用法

一、条件测试操作

1.test测试

要使 Shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作。
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具——test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。

语法格式:

格式1:test条件表达式
格式2:[ 条件表达式 ]

2.文件测试

文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。
文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。

-d:测试是否为目录 (Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)

-r:测试当前用户是否有权限读取(Read) 。
-w:测试当前用户是否有权限写入(write) 。
-x:测试是否设置有可执行(Excute)权限。
-b:测试是否为设备文件
-c:测试是否为字符设备文件
-s:测试存在且文件大小为空
-L:测试是否为链接文件

执行条件测试操作以后,通过预定义变量 $?可以获得测试命令的返回状态值,从而判断该条件是否成立。
执行以下操作可测试目录/media/是否存在,如果返回值$?为0,表示存在此目录,否则表示不存在或者虽然存在但不是目录

[root@localhost ~]# test -d /etc/sysconfig/        #测试是否为目录
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e /etc/sysconfig/        #测试目录或文件是否存在
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -f /etc/sysconfig/        #测试是否为文件
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /etc/sysconfig ] && echo "是目录"    #&&表示逻辑与,“而且”的意思
是目录
[root@localhost ~]# echo $?
0

3.整数值比较

整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。
整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整数之间。
常用测试操作符

-eq 第一个数等于(Equal)第二个数
-ne 第一个数不等于(Not Equal)第二个数
-gt 第一个数大于(Greater Than)第二个数
-lt 第一个数小于(Lesser Than)第二个数
-le 第一个数小于或等于(Lesser or Equal)第二个数
-ge 第一个数大于或等于(Greater or Equal)第二个数
[root@localhost ~]# who | wc -l
2
[root@localhost ~]# test $(who | wc -l) -le 5 "用户过少"
-bash: test: 参数太多
[root@localhost ~]# [ $(who | wc -l) -le 5 ] && echo "用户过少"
用户过少

4.字符串比较

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

格式2:
[ -z 字符串 ]

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

5.逻辑测试

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

常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否

[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "not en.US"   #测试当前语言环境
not en.US

[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖

二、if语句

1.单分支结构

单分支结构

if 条件测试操作
then  命令序列1
fi

例:
[root@localhost ~]# vim li1.sh
#!/bin/bash
if ls -l /home
then
  echo "以上为home目录下的所有信息"
fi
[root@localhost ~]# vim li2.sh 
#!/bin/bash
M="/mnt/centos7"
if [ ! -d $M ]
then
mkdir -p $M
echo "$M 已存在"
fi
[root@localhost ~]# sh li2.sh
/mnt/centos7 已存在
[root@localhost ~]# vim li3.sh
#!/bin/bash
read -p "请输入文件名:" file
if [[ $file = *.sh ]]     #这里两个中括号是因为需要识别*,否则单个中括号无法识别
then
echo "这是shell脚本"
fi

2.双分支结构

if   条件测试操作
    then   命令序列1
    else    命令序列2
fi

例:
[root@localhost ~]# vim li4.sh
#!/bin/bash
IP=192.168.9.131
ping -c 3 -i 0.5 -w 3 $IP &> /dev/null   #ping3次,每0.5秒一次,3秒后结束
if [ $? -eq 0 ]
then
  echo "$IP is up"
else
  echo "$IP is down"
fi
[root@localhost ~]# chmod +x li4.sh 
[root@localhost ~]# sh li4.sh 
192.168.9.131 is up
[root@localhost ~]# vim li5.sh
#!/bin/bash
if [ $UID -eq 0 ]
then
  echo "当前用户为root"
else
  echo "当前用户不是root"
fi
[root@localhost ~]# sh li5.sh 
当前用户为root
[root@localhost home]# vim httpd1.sh
#!/bin/bash
pgrep aux | grep httpd | grep -v grep
if [ $? -ne 0 ]
then
   if [ "$(rpm -q httpd)"=="未安装软件包 httpd" ]
  then
   yum install httpd -y
   systemctl start httpd
  echo "网站服务已安装启动"
  else
   systemctl start httpd
  echo "网站服务已启动"
fi
  else
  echo "网站服务运行中"
fi

3.if多分支结构

多分支结构                              
if 条件测试操作1                         
   then 命令序列1                 
elif 条件测试操作2                       
else                   
  命令序列3
fi 
[root@localhost home]# vim test1.sh 
#!/bin/bash
read -p "请输入你的考试分数(0-100):" GRADE
if [ $GRADE -eq 100 ];then
   echo "$GRADE 分:满分"
elif [[ $GRADE -le 99 && $GRADE -ge 90 ]];then
   echo "$GRADE 分:抄错题10遍"
elif [[ $GRADE -le 89 && $GRADE -ge 80 ]];then
   echo "$GRADE 分:抄错题20遍"
elif [[ $GRADE -le 79 && $GRADE -ge 60 ]];then
   echo "$GRADE 分:抄错题30遍"
elif [[ $GRADE -le 59 && $GRADE -ge 0 ]];then
   echo "$GRADE 分:全抄30遍"
else
   echo "$GRADE :输入错误,请重输"
fi
[root@localhost home]# chmod +x test1.sh 
[root@localhost home]# sh test1.sh 
请输入你的考试分数(0-100):99
99 分:抄错题10遍

三、case语句

case多分支结构

case 变量值 in                   
模式1)                                 
   命令序列1                           
   ;;                                       
模式2)                                 
   ;;                                            
   ......                                          
*)                             
   默认命令序列  
esac 
[root@localhost home]# vim test2.sh 
#!/bin/bash
read -p "请输入月份:" season

[ $season -ge 1 -a $season -le 3 ] && a=0
[ $season -ge 4 -a $season -le 6 ] && a=1
[ $season -ge 7 -a $season -le 9 ] && a=2
[ $season -ge 10 -a $season -le 12 ] && a=3

case $a in
0)
echo "春季"
;;
1)
echo "夏季"
;;
2)
echo "秋季"
;;
3)
echo "冬季"
;;
*)
echo "输入有误"
esac
[root@localhost home]# chmod +x test2.sh 
[root@localhost home]# sh test2.sh 
请输入月份:3
春季
上一篇:Student Demo(实习的第一个小小小Demo)


下一篇:java班级类拓展 两门成绩 子类小组