📖 知识点
1. for 循环(数多少次 / 遍历列表)
for 变量 in 值1 值2 值3; do
循环体
done
#!/bin/bash
for i in 1 2 3 4 5; do
echo "第 $i 次"
done
for把每个值依次赋给i,每赋值一次执行一次循环体,最后done结束。输出 "第 1 次" 到 "第 5 次"。
2. 用 for 处理文件(最实用)
结合 ls/find,对每个文件执行操作:
#!/bin/bash
for f in *.txt; do
echo "处理文件:$f"
cat "$f"
done
*.txt匹配当前目录所有 txt 文件,对每个都执行循环体。批量处理文件的神技。
3. while 循环(条件成立就重复)
while [ 条件 ]; do
循环体
done
#!/bin/bash
n=1
while [ $n -le 5 ]; do # n <= 5 就一直循环
echo "第 $n 次"
n=$((n+1)) # 数字加1,防止死循环
done
while条件成立就循环,条件不成立就停。一定要让条件 "会变化"(如 n 递增),否则死循环。
4. 完整示例(批量备份)
#!/bin/bash
mkdir -p 备份
for f in *.txt; do
cp "$f" 备份/
echo "已备份:$f"
done
echo "全部备份完成!"
⚠️ 易错提醒
for ... in ...; do ... done:do前有分号;,结束用done
while循环要让条件能变化(如n=$((n+1))),否则死循环文件变量用引号
"$f"包起来,文件名带空格时更安全
⚔️ Kata 实战任务
任务需求:
回家,创建几个 txt 文件(touch a.txt b.txt c.txt)
用 vim 写一个
备份.sh:用 for 循环遍历所有.txt,复制到 "备份" 目录并打印运行脚本,观察对每个文件执行了循环
用 ls 验证备份目录里文件都到位
参考代码(在终端依次敲)
# 准备几个文件
cd ~
touch a.txt b.txt c.txt
# 1. 创建循环备份脚本
vim 备份.sh
# 内容:
# #!/bin/bash
# mkdir -p 备份
# for f in *.txt; do
# cp "$f" 备份/
# echo "已备份:$f"
# done
# echo "全部备份完成!"
# (:wq 保存退出)
# 2. 运行脚本
bash 备份.sh
# 3. 验证备份结果
ls 备份
运行示例:
user@linux:~$ bash 备份.sh
已备份:a.txt
已备份:b.txt
已备份:c.txt
全部备份完成!
user@linux:~$ ls 备份
a.txt b.txt c.txt
💡 观察:脚本用
for f in *.txt自动遍历 3 个 txt 文件,每个都执行 "复制 + 打印",一次循环搞定全部备份。不用手动复制三遍。
🧠 思考题
for f in *.txt; do ... done里,f会依次等于什么?循环执行了几次?while循环和for循环的区别是什么?while循环为什么要注意防止 "死循环"?