5月30日 00:10

Shell 中 if 和 case 语句有什么区别?如何使用?

if 适合判断条件真假,比如文件是否存在、变量是否为空、命令是否执行成功;case 适合一个变量匹配多个模式,比如菜单选项、文件后缀、运行环境。写 Shell 条件判断时,变量要加引号,复杂字符串判断优先用 [[ ]],数字计算用 (( ))

追问

[ ][[ ]] 有什么区别?

[ ] 是传统 test 写法,兼容性好但限制多;[[ ]] 是 Bash 扩展,支持 &&||、模式匹配和正则,变量未加引号时也更不容易出错。写 Bash 脚本通常优先用 [[ ]]

if 能直接判断命令结果吗?

可以。if grep -q "ERROR" app.log; then ... fi 判断的是命令退出码,0 表示成功,非 0 表示失败。这比手动判断 $? 更清晰。

case 适合替代多个 elif 吗?

当你围绕同一个变量做多分支匹配时,case 更清楚。它支持通配符,比如 *.log)start|restart),最后用 *) 兜底。

常见坑是什么?

[ $name = foo ] 在变量为空时会语法错误,应该写 [ "$name" = "foo" ]。另外 -a-o 可读性差,建议拆成 [ cond1 ] && [ cond2 ]

写段代码

bash
file="$1" if [[ -f "$file" && -r "$file" ]]; then echo "readable file" fi case "$file" in *.sh) echo "shell script" ;; *.log) echo "log file" ;; *) echo "unknown" ;; esac
标签:Shell