Linux case分支语句的用法(附带实例)
多分支 case 条件语句和 if…elif…else(多分支 if)条件语句相同点在于,它们都属于是多分支判断语句;不同点在于,多分支 if 条件语句拥有多个条件判断式,是对条件进行判断,如判断文件类型、判断文件权限等。多分支 case 条件语句是对字符串进行判断,只要输入的字符串和 case 中的值相同,就认为判断成立。
因此,通常我们对类型进行判断时需要使用 if 判断,如果只是对字符串本身进行判断,就使用多分支 case 条件语句。
多分支 case 条件语句的语法如下:
这条语句需要注意以下内容:
注意,多分支 case 条件语句只能判断变量的值到底是什么,而不能像多分支 if 条件语句那样,可以判断多个条件,因此多分支 case 条件语句更加适合单条件多分支的情况。
例如,我们在系统中经常看到请选择“yes/no”,或者在命令的输出中选择是执行第一个选项还是执行第二个选项(fdisk 命令)。在这些情况下,使用多分支case条件语句最为合适。下面写一个选择“yes/no”的例子,命令如下:
在学习了多分支 case 条件语句的使用方式后,我们可以结合之前的 sed 语句等,编辑一些能够用于修改配置文件的脚本,如永久修改 SELinux 配置文件:
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,那么输出错误提示并退出脚本。
因此,通常我们对类型进行判断时需要使用 if 判断,如果只是对字符串本身进行判断,就使用多分支 case 条件语句。
多分支 case 条件语句的语法如下:
case $变量名 in 值 1) 如果变量的值等于值 1,就执行程序 1 ;; 值 2) 如果变量的值等于值 2,就执行程序 2 ;; ...省略其他分支... *) 如果变量的值都不是以上的值,就执行此程序 ;; esac
这条语句需要注意以下内容:
- 多分支 case 条件语句会提取变量中的值,然后与语句体中的值逐一比较。如果数值符合,就执行对应的程序,在程序执行后结束多分支 case 条件语句;如果数值不符,就依次比较下一个值;如果所有的值都不符合,就执行“*)”后的程序;
- 多分支 case 条件语句以“case”开头,以“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,那么输出错误提示并退出脚本。