
一、条件语句在做什么1. 一句话理解让脚本“看情况办事”而不是从头到尾一条道走到底生活类比下雨就带伞否则戴帽子2. 判断的本质新手第一课Shell 里没有 true/false 值只有命令的退出状态码退出码 0 成功 真非 0 失败 假最容易记反3. 三大骨架顺序执行默认从上到下条件分支if / case循环for / while条件语句的服务对象4. 四件武器if多分支判断最常用[ ]/[[ ]]条件测试if 的“眼睛”case多值匹配比一堆 elif 清爽/||短路执行一行搞定简单判断二、test 与三种括号1. 三种写法test 条件老写法和[是同一个东西[ 条件 ]POSIX 标准所有 shell 都认[[ 条件 ]]bash 扩展支持、||、~通配符(( 表达式 ))算术专用变量不用加$2. 括号速查[ ]字符串 / 文件测试最通用[[ ]]写 bash 脚本优先用它(( ))只做数学比较写法自然3. 空格陷阱必背中括号两侧必须有空格[$a -eq 1]必定报错变量不加引号空值会引发语法错误统一写成[ $a $b ]最省心三、数值比较1. 六个运算符只比整数-eq等于 /-ne不等于-gt大于 /-lt小于-ge大于等于 /-le小于等于记忆e equalg greaterl lesst than2. 两种写法if [ $age -ge 18 ]; then ... fiif (( age 18 )); then ... fi更直观3. 面试坑点用比大小会变重定向[ $a $b ]会悄悄建文件[ 10 9 ]可能是假因为退化成字符串比较小数不能用-gt要配bc或awk四、字符串比较1. 运算符相等[ ]里别用!不等-z长度为 0 为真zero-n长度非 0 为真non-zero2. 高频坑[ -n $a ]在 a 为空时变成[ -n ]竟然也返回真结论-n必须加引号[ -n $a ]变量含空格不加引号会被拆成多个参数3. [[ ]] 的加成[[ $s a* ]]右侧当通配符不必加引号[[ $s ~ ^[0-9] ]]正则匹配判断是否纯数字正则捕获结果存到BASH_REMATCH数组五、文件与目录测试1. 存在性-e存在文件或目录-f普通文件-d目录-L软链接 /-h同义-s存在且非空2. 权限类-r可读 /-w可写 /-x可执行注意对 root 常恒为真别用 root 验证3. 时间类file1 -nt file2前者更新file1 -ot file2前者更旧4. 组合与实战[[ -f $f -r $f ]]存在且可读[[ ! -d $dir ]] || mkdir -p $dir[[ ! -s app.log ]] echo 今日无日志脚本开头校验配置文件不存在就exit 1六、if 的三种形态1. 单分支if 条件; then 命令; fi满足才做事不满足直接跳过2. 双分支 if-elseif 条件; then A; else B; fi二选一必定走一条3. 多分支 if-elif-else从上往下判断命中第一个就停后面不再看条件有重叠时顺序决定结果elif后面不能再写else if会变成嵌套fi是 if 倒写唯一的结束符4. elif 与多个独立 if 的区别常问elif互斥只执行一个分支独立if互不相关可能全部执行5. 一行式写法[ -f $f ] echo yes || echo noA 失败也会跳到 no[[ 条件 ]] { cmd1; cmd2; }花括号末尾分号不能少七、逻辑组合与或非1. 三种写法[ ]内-a与、-o或、!非已不推荐[[ ]]内、||、!推荐括号( ... )可分组两侧要留空格2. 优先级!||别靠记直接加括号3. 短路特性A BA 假则 B 不执行A || BA 真则 B 不执行这是控制流程的核心机制4. 辨析-a/-o是 test 命令内部逻辑/||是 shell 连接符混用会优先级错乱[[ ]]里别写-a、-o八、case多值匹配1. 基本语法case $var in 模式) 命令;; *) 默认;; esac双分号;;是分支终点漏了会语法错esac是 case 倒写2. 三种结束符加分项;;正常结束;;继续尝试匹配后续分支bash 4;无条件执行下一个分支类似 C 的 fallthrough3. 模式规则支持通配符*、?、[abc]用|并列多个值start|restart)只看字符串不认数值大小4. 何时用 case一个变量对多个固定值分支服务的 start/stop分支超过 3 个if-elif 会很难看需要通配符匹配字符串时5. 经典模板服务启停start|stop|restart|status参数解析-h|--help、-v|--version按文件扩展名分派处理逻辑九、总结Q1[ ] 和 [[ ]] 区别[ ]是外部命令[[ ]]是 shell 关键字[[ ]]不分词、支持、||、~通配符[[ ]]是 bash 专有写 sh 要用[ ]Q2 与 的区别[ ]里用不保证可用[[ ]]里两者都行Q3-a 与 的区别-a是 test 内部逻辑是 shell 连接符混用导致优先级错乱Q4如何判断变量为空[[ -z $a ]]引号不能省Q5if 和 case 怎么选区间 / 大小 / 复杂逻辑 → if固定值枚举 / 通配匹配 → caseQ6set -e 有什么坑条件内命令不触发管道只看末条(( ))返回值干扰Q7如何判断命令是否存在command -v xxx /dev/null 21Q8$? 为 0 代表什么上一条命令执行成功不是“条件为真”Q9 和 || 优先级!||左结合Q10多条件判断的优雅写法[[ A B ]]别用[ A -a B ]