首页 > 编程笔记 > Linux笔记 阅读:16

Linux case分支语句的用法(附带实例)

多分支 case 条件语句和 if…elif…else(多分支 if)条件语句相同点在于,它们都属于是多分支判断语句;不同点在于,多分支 if 条件语句拥有多个条件判断式,是对条件进行判断,如判断文件类型、判断文件权限等。多分支 case 条件语句是对字符串进行判断,只要输入的字符串和 case 中的值相同,就认为判断成立。

因此,通常我们对类型进行判断时需要使用 if 判断,如果只是对字符串本身进行判断,就使用多分支 case 条件语句。

多分支 case 条件语句的语法如下:
case $变量名 in
    值 1)
        如果变量的值等于值 1,就执行程序 1
        ;;
    值 2)
        如果变量的值等于值 2,就执行程序 2
        ;;
    ...省略其他分支...
    *)
        如果变量的值都不是以上的值,就执行此程序
        ;;
esac

这条语句需要注意以下内容:
注意,多分支 case 条件语句只能判断变量的值到底是什么,而不能像多分支 if 条件语句那样,可以判断多个条件,因此多分支 case 条件语句更加适合单条件多分支的情况。

例如,我们在系统中经常看到请选择“yes/no”,或者在命令的输出中选择是执行第一个选项还是执行第二个选项(fdisk 命令)。在这些情况下,使用多分支case条件语句最为合适。下面写一个选择“yes/no”的例子,命令如下:
[root@localhost ~]# vim /root/case1.sh
#!/bin/bash
#判断用户的输入

read -t 30 -p "Please choose yes/no:" cho
#在屏幕上输出“请选择 yes/no”,然后把用户的选择赋予变量 cho

case $cho in
    "yes")
        #如果是 yes
        echo "Your choose is yes!"
        #就执行程序 1
        ;;
    "no")
        #如果是 no
        echo "Your choose is no!"
        #就执行程序 2
        ;;
    *)
        #如果既不是 yes 也不是 no
        echo "Your choose is error!"
        #就执行此程序
        ;;
esac
解释一下脚本思路,请用户输入 yes 或 no,如果输入的是 yes,就输出“Your choose is yes!”,然后结束 case 判断;如果输入的是 no,就输出“Your choose is no!”,然后结束 case 判断;如果输入的是其他字符,就输出“Your choose is error!”,然后结束 case 判断。

在学习了多分支 case 条件语句的使用方式后,我们可以结合之前的 sed 语句等,编辑一些能够用于修改配置文件的脚本,如永久修改 SELinux 配置文件:
#!/bin/bash
lnb=$(grep -n "^SELINUX=" /etc/selinux/config | cut -d ":" -f 1)
#变量名为 lnb,通过行级过滤和列级截取的方式来确认 SELinux 选项在当前文件的第几行
st=$(grep "^SELINUX=" /etc/selinux/config | cut -d "=" -f 2)
#变量名为 st,通过行级过滤和列级截取的方式来确认当前 SELinux 的状态

echo -e "当前 SELinux 状态是\e[1;31m${st}\e[0m"
#使用较为醒目的红色输出当前 SELinux 的状态

read -t 30 -p "是否需要永久修改 SELinux 开启状态 (yes/no):" rd_1
#通过 read 语句询问用户是否需要修改 SELinux 的状态,赋值给变量 rd_1

case $rd_1 in
    yes|y)
        #用户输入 yes 或 y 都能够表示进行修改
        echo "需要修改 SELinux"
        read -t 30 -p "您需要将 SELinux 修改为 (enforcing|permissive|disabled):" rd_2
        #通过 read 语句询问用户需要修改的 SELinux 状态,并将状态赋值给变量 rd_2
        case $rd_2 in
            enforcing|e)
                #当 rd_2 的值是 enforcing 或 e 的时候,表示开启 SELinux。
                sed -i "${lnb}s/\S/enforcing/" /etc/selinux/config && echo "success"
                #使用 $lnb 确认行号,将当前配置文件中 SELinux 状态替换为 enforcing,并在成功替换后输出 success
                ;;
            permissive|p)
                #当 rd_2 的值是 permissive 或 p 的时候,表示 SELinux 只输出提示,不影响用户操作
                sed -i "${lnb}s/\S/permissive/" /etc/selinux/config && echo "success"
                #使用 $lnb 确认行号,将当前配置文件中 SELinux 状态替换为 permissive,并在替换成功后输出 success
                ;;
            disabled|d)
                #当 rd_2 的值是 disabled 或 d 的时候,表示关闭 SELinux
                sed -i "${lnb}s/\S/disabled/" /etc/selinux/config && echo "success"
                #使用 $lnb 确认行号,将当前配置文件中 SELinux 状态替换为 disabled,并在替换成功后输出 success
                ;;
            *)
                echo "输入有误,请在(enforcing|permissive|disabled)中做出选择"
                #若变量 rd_2 的值不是 enforcing、permissive 或 disabled,则输出错误提示并退出 ;;
        esac
        ;;
    no|n)
        echo "不修改 SELinux"
        #如果变量 rd_1 的值是 no 或 n,就表示不修改 SELinux 配置文件
        ;;
    *)
        echo "请在 yes 和 no 之间做出选择"
        #如果变量 rd_1 的取值既不是 yes 也不是 no,就输出错误提示并退出 ;;
esac
下面分析一下这个脚本:
1) 首先,通过对 SELinux 配置文件的过滤和截取,得到 SELinux 选项所在的行和当前 SELinux 配置文件中 SELinux 的状态。

2) 其次,使用 echo 的方式输出 SELinux 当前的状态,再使用 read 语句询问用户是否需要修改 SELinux 状态,使用变量 rd_1 接收用户输入。

3) 接下来,使用 case 语句对于变量 rd_1 的值进行判断,当值为 yes 或 y 的时候,表示需要修改 SELinux。在 case 语句中,可用“|”来分隔多个相同分支中的多个相同含义值。但注意,在使用“|”分隔多个值时,不要使用双引号将所有值包含在内,否则它们会被认为是一个整体。

假设用户需要修改 SELinux,使用 read 语句接收要修改的 SELinux 状态,并将其赋值给变量 rd_2。接下来,在当前第一层 case 语句中嵌套另一个用于判断变量 rd_2 的 case 语句。SELinux 中有三个选项,即 enforcing、permissive、disabled,它们在进行 case 判断时可用 e、p、d 来进行简要表示。根据用户输入的不同字符串来确定如何进行替换。在替换过程中,因为 SELinux 选项所在行保存在 lnb 变量值中,所以需要调用 lnb 变量值进行替换,在 sed 替换需要调用变量值的情况下,我们可以选择使用双引号包含替换动作,$st 同理。如果用户输入的不是 enforcing、permissive、disabled、e、p、d 中的任意一个,那么输出错误提示。

4) 最后,我们再回到第一层 case 语句中,如果 rd_1 变量值为 no 或 n,就表示不需要修改 SELinux,输出“不修改SELinux”提示并退出当前脚本。如果 rd_1 变量值的取值不是 yes、y、no、n,那么输出错误提示并退出脚本。

相关文章