LinuxShell条件判断_if与case使用实践解析【教程】

11次阅读

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

LinuxShell 条件判断_if 与 case 使用实践解析【教程】

在 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。

text=ZqhQzanResources