Linux Shell中if语句基于退出状态实现分支判断,支持变量、数字、文件测试及嵌套;case语句用于高效多值字符串匹配,常与if混合使用;需注意引号、空格、通配符等规范以避免陷阱。

在Linux Shell脚本中,条件判断是控制程序流程的核心机制。if语句用于基于布尔表达式的分支执行,case语句则适用于多值匹配场景。以下是针对这两种结构的具体使用实践:
一、if语句基本语法与变量判断
if语句通过测试命令的退出状态(0为真,非0为假)决定是否执行分支代码块。最常用的是对变量值、文件属性或命令结果进行判断。
1、编写脚本文件,以#!/bin/bash开头,并添加可执行权限。
2、使用单对方括号[ ]进行简单比较,例如:if [ "$USER" = "root" ]; then echo "当前为root用户"; fi。
3、对数字比较需使用-eq、-gt等专用操作符,例如:if [ $COUNT -gt 10 ]; then echo "计数超过10"; fi。
4、嵌套if可使用elif关键字,避免多层缩进,例如:if [ $A -eq 1 ]; then echo "A为1"; elif [ $A -eq 2 ]; then echo "A为2"; else echo "A非1也非2"; fi。
二、if语句结合文件测试操作
Shell提供内置的文件测试操作符,用于判断文件是否存在、类型、权限等,常配合if使用以增强脚本健壮性。
1、检查文件是否存在且为普通文件:if [ -f "/etc/passwd" ]; then echo "/etc/passwd存在且是普通文件"; fi。
2、判断目录是否存在:if [ -d "/var/log" ]; then echo "/var/log目录存在"; fi。
3、验证文件是否具有可读权限:if [ -r "$CONFIG_FILE" ]; then echo "配置文件可读"; else echo "无读取权限"; fi。
4、组合多个条件时使用-a(与)或-o(或),例如:if [ -f "$FILE" -a -r "$FILE" ]; then echo "文件存在且可读"; fi。
三、case语句实现多分支字符串匹配
case语句通过模式匹配替代冗长的if-elif链,特别适合处理用户输入、参数解析等固定值集合场景,匹配效率高且结构清晰。
1、基本格式为case $VAR in PATTERN1) commands ;; PATTERN2) commands ;; *) default ;; esac。
2、使用通配符*匹配任意字符串,例如:case in start) systemctl start nginx ;; stop) systemctl stop nginx ;; restart) systemctl restart nginx ;; *) echo "用法:
2、使用通配符*匹配任意字符串,例如:case $1 in start) systemctl start nginx ;; stop) systemctl stop nginx ;; restart) systemctl restart nginx ;; *) echo "用法:$0 {start|stop|restart}"; exit 1 ;; esac。
{start|stop|restart}"; exit 1 ;; esac。3、多个模式可用竖线|分隔,例如:case $OS in "centos"|"rhel"|"fedora") echo "Red Hat系系统";; "ubuntu"|"debian") echo "Debian系系统";; *) echo "未知系统";; esac。
4、模式中可使用?匹配单个字符,[abc]匹配字符集,例如:case $CHAR in [0-9]) echo "数字";; [a-z]) echo "小写字母";; *) echo "其他字符";; esac。
四、if与case混合使用的典型场景
在复杂逻辑中,常将case用于主流程分发,再在各分支内使用if处理子条件,兼顾可读性与灵活性。
1、脚本接收命令行参数,先用case识别主指令,如backup、restore、list。
2、在backup分支中,用if判断目标路径是否存在且有写权限:if [ ! -w "$DEST_DIR" ]; then echo "备份路径不可写"; exit 2; fi。
3、在list分支中,用if检测是否启用详细模式:if [ "$VERBOSE" = "1" ]; then ls -la /data; else ls /data; fi。
4、restore分支中嵌套case处理不同压缩格式:case $ARCHIVE_EXT in ".tar.gz"|".tgz") tar -xzf $FILE ;; ".tar.bz2") tar -xjf $FILE ;; *) echo "不支持的归档格式";; esac。
五、常见陷阱与规避方式
Shell条件判断易受空格、未引号变量、特殊字符影响,导致语法错误或逻辑误判,需严格遵循书写规范。
1、变量必须用双引号包围,防止空值或含空格字符串引发语法错误:if [ "$INPUT" = "yes" ]; then ...;未加引号的[ $INPUT = "yes" ]在INPUT为空时会报错。
2、[ ]内部操作符两侧必须有空格,否则被当作单一字符串:if [ "$A"=1 ]是错误的,正确为if [ "$A" = 1 ]。
3、测试命令返回值应显式检查,避免依赖隐式行为:if grep -q "pattern" file; then ...;不要省略-q选项导致输出干扰后续逻辑。
4、case中的模式匹配不支持正则表达式,仅支持glob通配符;如需正则,应改用[[ ]]或外部命令如grep。










