课堂笔记:使用结构化命令(Shell 编程)
- if-then 语句
核心:if 后面跟命令,而非布尔表达式。
命令退出状态码为 0(成功)→ 执行 then 部分。
非 0 → 跳过 then,继续后续脚本。
语法:
fi
if-then-else:提供二选一分支。
bash
if command; then
commands1
else
commands2
fi
嵌套与 elif:避免多层嵌套,使用 elif 链。
bash
if command1; then
…
elif command2; then
…
else
…
fi - test 命令与方括号 [ ]
test 可测试数值、字符串、文件,条件成立返回 0,否则非 0。
等价写法:if test condition; then … 或 if [ condition ]; then …
注意:方括号与条件间必须有空格。
数值比较(仅支持整数):
操作符 含义
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
浮点数直接用 test 会报错,需用 bc 或双括号。
字符串比较:
操作符 含义
= / != 相等/不等(注意大小写)
< / > 小于/大于(必须转义,否则被 shell 解释为重定向)
-n 长度非 0
-z 长度为 0
排序顺序:sort 命令以小写优先,而 test 按 ASCII 码(大写 < 小写),注意差异。
文件比较(常用):
操作符 含义
-e 文件/目录存在
-f 存在且为普通文件
-d 存在且为目录
-r/-w/-x 可读/写/执行
-s 存在且非空
-O/-G 属于当前用户/组
-nt/-ot 比另一个新/旧 - 复合条件测试
使用布尔逻辑组合多个测试:
[ cond1 ] && [ cond2 ](与)
[ cond1 ] || [ cond2 ](或) - 高级测试:双括号 (( )) 与双方括号 [[ ]]
双括号 (( )):用于数学运算,支持 ++、**、<<、&& 等,且 > 无需转义。
bash
if (( val1 ** 2 > 90 )); then …
双方括号 [[ ]]:支持字符串模式匹配(如 [[ $USER == r* ]]),且 > 也无需转义。 - case 命令
代替多个 elif,用于匹配单个变量的多个值。
bash
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
) default commands;;
esac
每个分支以 ;; 结束,为默认分支。
练习1
练习二
课堂笔记:更多的结构化命令
- for 循环
基本语法:for var in list; do commands; done
列表来源:
直接写入(如 root haolin wang)
变量(如 $name_list)
命令输出(如( c a t f i l e ) )通配符(如 ∗ 遍历当前目录)处理复杂值:空格或特殊字符可用引号或转义。字段分隔符:通过修改 I F S 环境变量(如 I F S = (cat file)) 通配符(如 * 遍历当前目录) 处理复杂值:空格或特殊字符可用引号或转义。 字段分隔符:通过修改 IFS 环境变量(如 IFS=(catfile))通配符(如∗遍历当前目录)处理复杂值:空格或特殊字符可用引号或转义。字段分隔符:通过修改IFS环境变量(如IFS=‘\n’)控制如何分割列表。 - C 语言风格的 for
语法:for (( 变量赋值; 条件; 迭代运算 )); do commands; done
支持多个变量(如 a=1,b=10; a<=10; a++,b–)。 - while 循环
语法:while test-command; do commands; done
测试命令返回 0 时继续执行,非 0 时退出。
测试命令可以是任意命令或 [ ] 条件。 - until 循环
语法:until test-command; do commands; done
与 while 相反:测试命令返回非 0 时继续,返回 0 时退出。 - 嵌套循环
循环内可包含任意循环,执行次数为乘积关系。 - 控制循环
break:跳出当前循环(可加数字跳出多层,如 break 2)。
continue:跳过本次迭代剩余命令,进入下一次迭代。 - 重定向循环输出
在 done 后使用 >、>> 或 | 重定向整个循环的输出。
练习一
练习二
练习三