精读笔记 · 第26章 Shell 流程控制(测试/if/case)
大约 4 分钟
精读笔记 · 第26章 Shell 流程控制(测试/if/case)
精读整理自 RHCE9 随堂讲义(原文字版 14 页)|同名视频约 14 节(第02套) 关联知识文件:
分章笔记/01-Linux/02-07-Shell编程
一、条件测试三种写法与数值比较
- 三种格式:
test 条件、[ 条件 ](中括号内侧必须留空格)、[[ 条件 ]](更强大,支持正则 =~)。 - 数值比较符(不能用 > < =,那是重定向/赋值): | 操作符 | 含义 | 操作符 | 含义 | | --- | --- | --- | --- | |
-gt| 大于 |-ge| 大于等于 | |-lt| 小于 |-le| 小于等于 | |-eq| 等于 |-ne| 不等于 | - 变量长度:
${#变量};例if [ ${#ps} -lt 7 ]判断密码长度。 - 注意:if 判断不支持浮点;单独用
><会被当成重定向(要转义或换 -gt/-lt)。
二、文件测试(常用 -f -d -e -r -w -x)
| 操作符 | 含义 |
|---|---|
-e 路径 | 文件或目录存在 |
-f 文件 | 存在且是普通文件 |
-d 路径 | 存在且是目录 |
-b/-c/-p/-S/-h | 块设备/字符设备/管道/socket/符号链接 |
-r/-w/-x | 可读/可写/可执行 |
-s 文件 | 存在且大小>0 |
-O/-G | 属于当前用户/组 |
-g/-k | 有 SGID/粘滞位 |
- 例:
if [ -d $dir1 ]; then ... else ... fi判断备份目录是否存在。
三、字符串比较
[ "$select" = "yes" ]等于;!=不等于(叹号和等号间无空格);-z长度 0;-n长度非 0。- 双引号重要性:
[ -n "$var" ]——空/未定义变量在无引号时会报“一元表达式”错;变量内容不确定时建议先 -n/-z 检测。 - 混合条件:
&&/-a逻辑与、||/-o逻辑或;[[ ]]内用&&/||,[ ]内用-a/-o(也可[ ... ] && [ ... ]拼接)。 - 正则匹配:
[[ $pass =~ [a-z] ]](密码复杂度判断)。
四、if 分支结构
- 单分支:
if 条件; then 命令; fi(判断用户不存在再创建:id $name &>/dev/null; if [ $? -ne 0 ]; then useradd $name; fi)。 - 双分支:if...then...else...fi(存在提示、不存在则创建并设密码)。
- 多分支:if / elif / elif / else / fi(按小时判断 morning/noon/afternoon/night:
hour=\date +%H\)。 - 嵌套:else 内再嵌 if(先判断用户是否存在,再判断密码长度)。
- 可直接把命令当条件:
if id $name &>/dev/null; then ...(退出码 0 即真)。 - 语法注意:
then/fi与 if 同行要用;分隔;[后与]前必须有空格;用户输入字符串判断要加引号。
五、case 模式匹配(多选一等场景)
- 语法:
case $变量 in 模式1) 命令 ;; 模式2|别名) 命令 ;; # | 表示或,可写 Y|y|YES|yes *) 默认命令 ;; esac - 应用 1:删除用户前确认
Y|y|YES|yes→userdel -r $user,否则 thank you(比 if 的 -o 组合简洁)。 - 应用 2:JumpServer 跳板菜单(
cat <<EOF打印菜单 → read 选号 → case 中ssh alice@$web1等)。 - 应用 3:系统管理工具箱(h/f/d/m/u/q 对应 help/fdisk/df/free/uptime/exit;空输入
""不动作)。
六、脚本调试
sh -n 脚本:只查语法错误。sh -vx 脚本:显示执行全过程(v 显示原语句、x 展开调试)。
七、命令速查表
| 场景 | 写法 |
|---|---|
| 数值比较 | [ $a -gt $b ]、-lt/-eq/-ne/-ge/-le |
| 文件判断 | [ -f/-d/-e/-r/-w/-x 路径 ] |
| 字符串 | [ "$x" = "y" ]、!=、-z、-n |
| 正则匹配 | [[ $x =~ [a-z] ]] |
| 混合条件 | [ a -gt 1 -a b -gt 2 ]、[[ ... && ... ]] |
| if 多分支 | if ...; then ... elif ...; then ... else ... fi |
| case | `case $x in p1) ;; p2 |
| 调试 | sh -n 脚本、sh -vx 脚本 |
八、易错点
[ ]里外侧各要一个空格,then换行或加;。- 数值比较用
-gt/-lt;字符串相等=(test 里单等号)、==用于 [[ ]]。 - 变量要加双引号(防空变量/空格导致语法错);空串与未定义变量长度都为 0。
- 判断支持整数不支持小数;比较运算符单独出现会被 shell 当重定向。
- case 每个分支以
;;结束、整体以esac结束;*兜底分支放最后。 - 中文输入法输入符号(如
@_!)会导致正则匹配失败——注意输入法切换。
九、实操清单
数值/文件/字符串测试各 5 例并 echo $? 验证 → 密码长度单分支 → 用户存在性双分支 → 时间多分支(morning/noon/afternoon/night)→ case 三案例(删用户确认/JumpServer/系统工具箱)→ sh -n + sh -vx 调试。
十、本章自测
- -gt/-eq/-ge 含义?2. 判断目录存在用什么操作符?3. 字符串判空 -z/-n?4.
[ ]与[[ ]]支持的运算符区别?5. if 多分支关键字顺序?6. case 中|与;;与esac的作用?7. sh -n 与 sh -vx 区别?
