Linux Shell 结构化命令及更多的命令指令
课堂笔记
一、if-then 基础语句
1.核心逻辑
if 后面跟普通命令,不是等式
0 → 跳过 then,直接执行 fi 之后内容
2.示例
if - then 语 句中 , 不管 命 令是 否 成功 执 行 , 你 都只 有 一种选择
命令返回一个非零退出 状 态码 , i f - t he n - e l s e 语 句能 够 执 行另一组命令
嵌套的 if - then 语句位 于 主 if - then - else 语句 的 else 代 码 块 中
3.if-then-else 双分支
可以使用 else 部分的另一种形式: elif 。 这样就不用再书写多个 if - then 语句了4.嵌套 if /elif 多分支
elif = else if,不用多层嵌套
示例:
二、test 条件测试命令
if 只能判断命令执行状态,test 实现数值 / 字符串 / 文件条件判断
test 命令提供了在 if - then 语句中测试不同条件的途径
test 命令可以判断三类条件:
✓ 数值比较
✓ 字符串比较
✓ 文件比较
三、复合条件测试(逻辑与 / 或)
逻辑与 两个条件同时成立
[ 条件1 ] & 条件2 ]
逻辑或 || 任意一个成立
[ 条件1 ] || [ 条件2 ]
四、双方括号 [[]] & 双括号 (( ))
双括号命令 (( expression )) 允许你在比较过程中使用高级数学表达式
test 命令只能在比较中使用简 单的算术操作
双括号命令提供了更多的数学符号 , 并且不需要将双括号中表达式里的大于号转义
双方括号命令 [[ expression ]] 使用了 test 命令中采用的标准字符串比较 , 并且提供模式匹配
五、case 多分支匹配(替代大量 elif)
语法:
case $变量 in
匹配1|匹配2)
命令;;
匹配3)
命令;;
*) # 默认所有其他情况
默认命令;;
esac
六、课堂易错点总结(手写标注)
[ ] 左右必须空格,[1 -eq 2] 直接报错
单括号数值比较不能用 > <,要用 -gt -lt
bash 原生 test 不支持小数浮点运算
case 每个分支末尾必须 ;; 结束
if 语句必须成对出现 if … fi,嵌套 if 缩进对齐方便阅读
更多的结构化命令
一、for 循环(两种写法)
- 基础 for in 遍历循环
语法:
bash
运行
for 变量 in 取值列表
do
循环执行命令
done
支持多种列表来源:
直接写值:for user in root jack xh
变量存储列表:name_list=“a b c”; for u in $name_list
命令输出作为列表:for line in(cattest.txt)通配符遍历目录:forfilein./∗修改分隔符IFS:默认空格/制表/换行;IFS=(cat test.txt) 通配符遍历目录:for file in ./* 修改分隔符 IFS:默认空格 / 制表 / 换行;IFS=(cattest.txt)通配符遍历目录:forfilein./∗修改分隔符IFS:默认空格/制表/换行;IFS='\n’只按行分割,解决带空格文件 / 文本错乱
易错点:带空格 / 单引号的复杂值,需要转义或双引号包裹。 - C 语言风格 for 循环(数值计数专用)
语法:
bash
运行
for ((初始赋值;判断条件;迭代更新))
do
命令
done
二、while 循环(条件成立就循环)
语法:
bash
运行
while [ 条件测试 ]
do
循环体
done
逻辑:条件返回0(真),持续循环;条件非 0,结束循环。
关键点:循环内必须修改变量,否则死循环。
示例:
三、until 循环(和 while 完全相反)
语法:
bash
运行
until [ 条件 ]
do
循环体
done
逻辑:条件为假时执行循环;条件为真,退出循环。
练习 2:until 输出 100 以内 7 的倍数。
四、嵌套循环
循环内部再套循环(for/while/until 任意组合)
练习 3:双层 for 嵌套打印九九乘法表。
五、循环控制关键字 break /continue
break:直接跳出当前循环
break n:跳出 n 层嵌套循环
continue:跳过本次循环剩余代码,直接进入下一轮
continue n:跳到 n 层循环下一次迭代
六、循环处理文件数据 核心:修改IFS分隔符,嵌套循环读取/etc/passwd冒号分割字段
七、重定向循环输出
在done后加重定向 / 管道,整个循环输出统一处理
输出写入文件:done > output.txt
管道传递:done | sort
八、总结区分
for:已知遍历列表 / 固定次数(遍历文件、批量用户)
while:条件成立持续执行(倒计时、读取数据流)
until:条件不成立才执行(反向判断场景)
IFS:控制文本分割符号,处理带空格、冒号文件
break/continue:灵活中断循环,嵌套用数字指定层级
练习
用双引号包裹"$file",可以避免文件名带空格时循环拆分出错
./*代表当前目录下所有文件(包含普通文件、脚本、子文件夹)
每次循环会逐个取出文件,依次做可执行、可写两项权限判断并输出结果
7 的倍数从7开始,每次自增 7,只要数值小于 100 就输出 • until逻辑:条件成立就停止循环,所以判断条件写i−ge100(i≥100时停止)•while逻辑:条件成立继续循环,判断条件写i -ge 100(i≥100 时停止) • while逻辑:条件成立继续循环,判断条件写i−ge100(i≥100时停止)•while逻辑:条件成立继续循环,判断条件写i -lt 100(i<100 时继续)
嵌套循环:外层循环控制行数(乘数i,19),内层循环控制每行的列数(被乘数j,1i)
外层i代表乘法表的行号,内层j从 1 循环到当前行号i,保证第i行只有i个式子
echo -n:不换行输出同一行的算式,一行结束后用空echo换行
用for循环遍历用户名列表Tom Jerry Spike,批量创建用户
每个用户家目录/home/用户名下建立 3 个子文件夹:download、Picture、Document,用mkdir -p确保多级目录可创建
循环查看每个用户家目录内容,通过重定向统一写入output.txt
创建用户需要管理员权限,命令前加sudo
必须在具备 sudo 权限的普通账号(如课堂常用的wjx)或 root 下运行
若重复执行,已存在的用户和目录不会报错,可正常跳过
查看output.txt就能看到三个用户家目录及新建文件夹的完整信息
