macos上shell脚本条件判断主要用if和case:if适用于数值、字符串、文件状态及命令执行结果判断,需用[ ]或[[ ]]包裹条件;case适合匹配固定值或模式,如参数、文件扩展名等;注意macos默认zsh及bash版本兼容性问题。
macos 上写 shell 脚本做条件判断,核心就两条路:用 if 处理范围或逻辑关系,用 case 匹配固定值或模式。两者语法简洁,bash 默认支持,直接写就能跑。
用 if 判断数值、字符串或文件状态
if 适合做“大于”“等于”“存在与否”这类判断。关键点是:条件必须用 [ ] 或 [[ ]] 包裹,中间要有空格;then 可跟在分号后,也可换行。
- 判断数字大小:
if [ "$age" -gt 18 ]; then echo "成年人"; fi - 判断字符串相等:
if [[ "$os" == "mac" ]]; then echo "macOS 环境"; fi(推荐用[[ ]],支持==和通配符) - 判断文件是否存在:
if [ -f "/tmp/data.txt" ]; then echo "文件已生成"; fi - 判断命令是否成功(不写
[ ]):if grep -q "error" /var/log/system.log; then echo "发现错误日志"; fi
用 case 匹配用户输入或命令行参数
case 更适合处理有限的几个明确取值,比如菜单选项、脚本参数()、系统版本名等。结构清晰,不易漏分支,也更容易加通配符。
- 简单匹配:
case "$1" in start) echo "启动服务";; stop) echo "停止服务";; *) echo "用法:$0 {start|stop}";; esac - 支持通配:
case "$filename" in *.log) echo "日志文件";; *.conf) echo "配置文件";; *) echo "未知类型";; esac - 多个值归为一类:
case "$ARCH" in arm64|x86_64) echo "支持的架构";; *) echo "暂不支持";; esac
注意 macOS 的 bash 版本和兼容性
macOS 自 macOS Catalina(10.15)起默认 shell 是 zsh,但脚本里写 #!/bin/bash 仍可运行——前提是系统装了 bash(新版 macOS 不再预装较新 bash,需用 brew install bash 并改 shebang 为 #!/opt/homebrew/bin/bash 或 #!/usr/local/bin/bash)。更稳妥的做法是用 #!/usr/bin/env bash,它会自动找 PATH 中第一个 bash。
- 避免用 zsh 特有语法(如
[[ $x =~ regex ]]在旧 bash 不支持),如需正则,优先用grep配合 if - 测试脚本前先加执行权限:
chmod +x script.sh - 调试时可在开头加
set -x查看每条命令实际执行内容
一个实用小例子:根据当前 macOS 版本执行不同操作
下面这个片段能识别 macOS 主版本号(如 14 = Sonoma,15 = Sequoia),并做对应处理:
osver=$(sw_vers -productVersion | cut -d. -f1) case "$osver" in 14) echo "运行在 Sonoma,启用新 API";; 15) echo "运行在 Sequoia,启用实验特性";; *) echo "其他版本,使用兼容模式";; esac











