Shell条件语句

297 阅读5分钟

条件测试语句

文件测试

文件测试格式

 格式一: test 操作符 表达式
 ​
 格式二: [ 操作符 表达式 ]  
复制代码

常用的文件测试操作符:

操作符作用
-d测试文件是否为目录文件(Directory)
-f测试文件是否为普通文件(File)
-e测试目录或文件是否存在(Exist)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有权限执行(eXcute)
-L测试是否为符号链接(软链接文件)

示例1

[root@localhost ~]# test -d /etc/      //测试是否为目录
[root@localhost ~]# echo $?        //状态码返回0,表示为真,是目录
0
[root@localhost ~]# test -f /etc/sysconfig/       //测试是否为普通文件
[root@localhost ~]# echo $?          //状态码返回1,表示为假,不是普通文件
1

image.png

示例2

[root@localhost ~]# [ -e /etc/shadow ]       //测试文件是否存在
[root@localhost ~]# echo $?
0

image.png

示例3

[root@localhost ~]# [ -r /etc/shadow ]              //测试root用户对文件是否拥有读取权限
[root@localhost ~]# echo $? 
0
[root@localhost ~]# [ -w /etc/shadow ]             //测试root用户对文件是否拥有写入权限
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -x /etc/shadow ]             //测试root用户对文件是否拥有执行权限 
[root@localhost ~]# echo $?
1

image.png

整数测试

整数值比较:

 [  整数变量1  操作符  整数变量2  ] 
 ​
 test 整数变量1  操作符  整数变量2
复制代码

操作符:

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

示例

[root@localhost ~]# [ 2 -lt 3 ]
[root@localhost ~]# echo $?
0

image.png

**## 字符串测试

常用的测试操作符

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

字符串比较,常用的四种格式:

 [ "字符串1"  =  "字符串2"  ]   //测试字符串1和字符串2的内容是否相同
 [ "字符串1" !=  "字符串2”  ]   //测试字符串1和字符串2的内容是否不同
 [ -z "字符串" ]    //测试字符串是否为空,或者指定的变量是否为空值。(测试字符串的长度是否为零)
 [ -n "字符串" ]    //测试字符串是否存在,即是否不为空。(测试字符串的长度是否非零)

示例

[root@localhost ~]# [ $a = $b ];echo $?   //测试变量a和变量b的值是否相同
1
[root@localhost ~]# [ $USER = root ];echo $?      //测试当前用户是否为root
0

逻辑测试(短路运算)

逻辑测试用于连接多个测试条件,并返回整个表达式的值。 逻辑测试主要有"逻辑与","逻辑或","逻辑否"三种。

逻辑测试两种格式:

 格式一:[  表达式1  ]  逻辑运算符  [  表达式2  ] ...
 #例:[表达式1] && [表达式2]  等同于  [表达式1 -a 表达式2]  等同于  [[表达式1 && 表达式2]]
 #例:[表达式1] || [表达式2]  等同于  [表达式1 -o 表达式2]  等同于  [[表达式1 || 表达式2]]
 ​
 格式二:命令1  逻辑运算符  命令2  ... 
复制代码

逻辑运算符:

  • -a或&& :逻辑与,“而且”的意思,全真才为真。
  • -o或|| :逻辑或,“或者”的意思,一真即为真。
  • ! :逻辑否。

二元运算符

示例1:

[root@localhost ~]# [ 1 -lt 2 ] && [ 3 -eq 4 ]       //测试1是否小于2,同时3是否等于4
[root@localhost ~]# echo $?        //结果为假
1
[root@localhost ~]# [ 1 -lt 2 ] || [ 3 -eq 4 ]      //测试1是否小于2,或者3是否等于4
[root@localhost ~]# echo $?        //结果为真
0

image.png

示例2:

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

 [root@localhost ~]# a=5
 [root@localhost ~]# [ $a -ne 1 ]&&[ $a != 2 ]
 [root@localhost ~]# echo $?
 0
 [root@localhost ~]# [ $a -ne 1 -a  $a != 2 ]
 [root@localhost ~]# echo $?
 0
 [root@localhost ~]# [[ $a -ne 1 &&  $a != 2 ]]
 [root@localhost ~]# echo $?
 0

image.png

三元运算符

 [ 表达式 ]  && a           //相当于 if语句单分支结构
 ​
 [ 表达式 ]  && a || b      //相当于 if语句双分支结构
 ​
 [ 表达式 ]  || b           //相当于 if [表达式];else

示例

[root@localhost ~]# vim 555.sh   //使用三元运算符写脚本
#!/bin/bash  ping -c 3 -i 0.5 -w 3 $1 &>/dev/null && echo "$1 is up" || echo "$1 is down"

[root@localhost ~]# bash 555.sh 192.168.1.10   //执行脚本测试主机是否在线
192.168.1.10 is up
[root@localhost ~]# bash 555.sh 192.168.1.100
192.168.1.100 is down

image.png

if 语句

if 单分支结构

单分支语句格式:

 if  判断条件
 ​
 then  条件成立的分支代码
 ​
 fi                         //条件不成立直接结束

image.png

示例

判断已用磁盘空间是否大于80%,如果是就报警提示。

[root@localhost ~]# df
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/mapper/centos-root 17811456 3692028 14119428   21% /
devtmpfs                  917604       0   917604    0% /dev
tmpfs                     933524       0   933524    0% /dev/shm
tmpfs                     933524    9240   924284    1% /run
tmpfs                     933524       0   933524    0% /sys/fs/cgroup
/dev/sda1                1038336  182376   855960   18% /boot
tmpfs                     186708      12   186696    1% /run/user/42
tmpfs                     186708       0   186708    0% /run/user/0
[root@localhost ~]# df |grep /dev/sda1
/dev/sda1                1038336  182376   855960   18% /boot
[root@localhost ~]# df |grep /dev/sda1 |awk '{print $5}'
18%
[root@localhost ~]# df |grep /dev/sda1 |awk '{print $5}' |awk -F % '{print $1}'
18

[root@localhost ~]# vim 666.sh

#!/bin/bash
a=$(df |grep /dev/sda1 |awk '{print $5}' |awk -F % '{print $1}')
if [ $a -gt 10 ]
 then
  echo "内存不足"
fi
[root@localhost ~]# bash 666.sh 
内存不足

image.png

image.png

 if 双分支结构

双分支语句格式:

 if 判断条件
 then
     条件成立的分支代码
 else
     条件不成立的分支代码
 fi

image.png

示例

检测80端口是否在监听,如果是,则提示”网站服务已在运行“;如果否,则启动httpd服务。

[root@localhost ~]# vim 777.sh
#!/bin/bash
ss -ntap |grep :80 &>/dev/null
if [ $? -eq 0 ]
  then
    echo "http服务正在运行"
else
   echo "http服务未运行"
fi

[root@localhost ~]# bash 777.sh 
http服务未运行
[root@localhost ~]# systemctl start httpd.service 
[root@localhost ~]# bash 777.sh 
http服务正在运行

image.png

if 多分支结构

多分支语句格式:

 if 判断条件1
 then
     条件1为真的分支代码
 ​
 elif 判断条件2
 then
     条件2为真的分支代码
 ​
 elif 判断条件3
 then
     条件3为真的分支代码
 ​
 ...
 else
     以上条件都为假的分支代码
 ​
 fi

image.png

示例

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

[root@localhost ~]# vim demo1.sh 

#!/bin/bash
#百米成绩
read -p "请输入100米赛跑的秒数:" time

if [ $time -gt 0 ] && [ $time -lt 10 ]
 then
   echo "进入选拔赛"
 #判断男女性别

 read -p "请输入性别(b(男)/g(女)):" sex
 if [ $sex = b ]
   then
    echo "进入男生组"
   elif [ $sex = g ]
     then
       echo "进入女生组"
  else
  echo "错误"
fi

 elif [ $time -gt 10 ]
   then
    echo "淘汰"
else
  echo "请重新输入"

[root@localhost ~]# bash demo1.sh 
请输入100米赛跑的秒数:5
进入选拔赛
请输入性别(b(男)/g(女)):b
进入男生组

image.png

image.png

case语句

格式:

 case 变量引用 in
 模式1)
     命令分支1
     ;;
 模式2)
     命令分支2
     ;;
 ...
 *)
     默认命令分支
 esac

示例

提示用户输入分数(0-100),判断分数范围,分出优秀、良好、及格、不及格四档。如果用户输入的分数值不在0-100之间,则提示重新输入。

[root@localhost ~]# vim 888.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" a
case $a in
100)
     echo "优秀"
     ;;
[89][0-9])
     echo "良好"
     ;;
[67][0-9])
     echo "及格"
     ;;
[0-9]|[1-5][0-9])
     echo "不及格"
     ;;
*)
     echo "输入有误,请重新输入,范围0-100"
esac

[root@localhost ~]# bash 888.sh 
请输入你的分数(0-100):0
不及格
[root@localhost ~]# bash 888.sh 
请输入你的分数(0-100):20
不及格
[root@localhost ~]# bash 888.sh 
请输入你的分数(0-100):60
及格
[root@localhost ~]# bash 888.sh 
请输入你的分数(0-100):90
良好
[root@localhost ~]# bash 888.sh 
请输入你的分数(0-100):100
优秀
[root@localhost ~]# bash 888.sh 
请输入你的分数(0-100):110
输入有误,请重新输入,范围0-100

image.png

image.png