7. Shell 脚本 IF 语句全解析:单分支 / 双分支 / 多分支结构及常见场景案例全解析
7.1 if 条件语句
if条件语句是Linux运维人员在实际生产工作中使用得最频繁也是最重要的语句,因此,请务必重视if条件语句的知识,并牢固掌握。
7.1.1 if 条件语句的语法
if条件语句,其语义类似于汉语里的“如果…那么”。
1. 单分支结构
第一种语法:
if <条件表达式>
then
指令
fi
第二种语法:
if <条件表达式>;then
指令
fi
上文的“<条件表达式>”部分可以是test、口、[[]]、(())等条件表达式,甚至可以直接使用命令作为条件表达式。每个if条件语句都以if开头,并带有then,最后以fi结尾。
第二种语法中的分号相当于命令换行,上面的两种语法含义是相同的,读者可根据习惯自行选择。
本书主要使用第二种语法格式。
在所有编程语言里,if条件语句几乎是最简单的语句格式,且用途最广。当if后面的<条件
表达式>成立时(真),就会执行then后面的指令或语句;否则,就会忽略then后面的指令或语句,
转而执行fi下面的程序。
if单分支语句执行流程逻辑图如下:

条件语句还可以嵌套(即if条件语句里面还有if条件语句),注意每个if条件语句中都要有一个与之对应的fi(if反过来写),每个if和它下面最近的fi成对搭配,语法示例如下:
if <条件表达式>;then
if <条件表达式>;then
指令
fi
fi
提示:通常在书写Shell条件语句时,要让成对的条件语句关键字的缩进相对应,以便于阅读浏览。
前文曾讲解过的文件条件表达式:
[ ! -d /tmp/laoma ] && mkdir /tmp/laoma
等价于下面的if条件语句:
if [ ! -d /tmp/laoma ];then
mkdir /tmp/laoma
fi
记忆小技巧:女孩对男孩说。
如果 你有房;那么 我就嫁给你 果如
2. 双分支结构
if条件语句的双分支结构主体则为:“如果…,那么…,否则…”。
if条件语句的双分支结构语法为:
if <条件表达式>;then
指令集1
else
指令集2
fi
if 双分支语句执行流程逻辑图如下:

前文的文件测试条件表达式
[ -d /tmp/laoma ] && echo /tmp/laoma is exist || mkdir /tmp/laoma
就相当于下面的双分支的if条件语句:
if [ -d /tmp/laoma ];then
echo /tmp/laoma is exist
else
mkdir /tmp/laoma
fi
记忆小技巧:女孩对男孩说。
如果 你有房;那么 我就嫁给你 否则 我再考虑考虑 果如
3. 多分支结构
if条件语句多分支结构的主体为:“如果…,那么…,否则如果…,那么,否则如果…,那么…,否则…”。
if条件语句多分支语法为:
if <条件表达式1>;then
指令1
elif <条件表达式2>;then
指令2
else
指令3
fi
多个elif
if <条件表达式1>;then
指令
elif <条件表达式2>;then
指令
elif <条件表达式3>;then
指令
else
指令
fi
提示:
- 注意多分支elif的写法,每个elif都要带有then。
- 最后结尾的else后面没有then。
if多分支语句执行流程对应的逻辑图如下:

记忆小技巧:女孩对男孩说。
如果 你有房;那么 我就嫁给你 或者 你有钱;那么 我也可以嫁给你 否则 我再考虑考虑 果如
7.1.2 if 条件语句多种条件表达式语法
if条件语句(包括双多分支if)的“<条件表达式>”部分可以是test、[]、[[]]、(())等条件表达式,甚至还可以直接使用命令作为条件表达式,具体的语法如下。
1. test条件表达式
if test 表达式;then
指令
fi
2. []条件表达式
if [ 字符串 或 算术表达式 ];then
指令
fi
3. [[]]条件表达式
if [[ 字符串 或 算术表达式 ]];then
指令
fi
4. (())条件表达式
if ((算术表达式));then
指令
fi
5. 命令表达式
if 命令;then
指令
fi
说明:以上表达式除了语法不同之外,具体的应用是一致的,实际工作场景中,读者只需选择一种适合自己习惯的表达式就好。
7.1.3 if 条件语句实践
示例1:检测sshd服务是否运行,如果未运行则启动sshd服务。
#!/bin/bash
systemctl is-active sshd &>/dev/null
if [ $? -ne 0 ];then
echo "sshd is not running, I'll start sshd."
systemctl start sshd
fi
示例2:检测sshd服务是否运行,如果未运行则启动sshd服务;如果运行,输出 “Running”。
#!/bin/bash
systemctl is-active sshd &>/dev/null
if [ $? -ne 0 ];then
echo "sshd is not running."
echo -n "Starting sshd ... ..."
systemctl start sshd && echo DONE
else
echo "sshd is running"
fi
示例3:通过传参控制sshd服务。
#!/bin/bash
if [ "$1" == "start" ];then
systemctl start sshd
elif [ "$1" == "stop" ];then
systemctl stop sshd
elif [ "$1" == "status" ];then
systemctl status sshd
elif [ "$1" == "restart" ];then
systemctl restart sshd
else
echo "Usage: $0 start|stop|status|restart "
fi
或者
#!/bin/bash
if [ "$1" = "start" -o "$1" = "stop" -o "$1" = "status" -o "$1" = "restart" ];then
systemctl $1 sshd
else
echo "Usage: $0 start|stop|status|restart"
fi
示例4:任意给三个整数,对三个数进行从大到小排序并输出。
#!/bin/bash
a=10
b=20
c=30
# 如果a小于b,交换值,此时a大b小
if [ $a -lt $b ];then
num=$b;b


1610

被折叠的 条评论
为什么被折叠?



