7.Shell 脚本 IF 语句全解析:单分支 / 双分支 / 多分支结构及及常见场景案例全解析

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

提示:

  1. 注意多分支elif的写法,每个elif都要带有then。
  2. 最后结尾的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值