Shell 文件处理:重定向读取并清理临时目录
创建临时目录和带空格文件名,逐行累计数据,并用 trap 清理资源,避免管道子 Shell 使累计变量丢失。
本节目标
创建临时目录和带空格文件名,逐行累计数据,并用 trap 清理资源,避免管道子 Shell 使累计变量丢失。
环境与运行方法
使用 Bash 3.2 及以上,保存为 lesson.sh,执行 bash -n lesson.sh 检查语法,再运行 bash lesson.sh。不要使用 sh 替代 Bash,本组使用部分 Bash 专有语法。
核心思路
while 通过输入重定向读取文件,累计变量留在当前 Shell。IFS= 与 read -r 保留文本边界,mktemp 创建独立目录,trap 在退出时清理本次目录。
完整示例
directory=$(mktemp -d) || exit 1
trap 'rm -rf -- "$directory"' EXIT
file="$directory/study records.txt"
printf '20\n35\n0\n' > "$file"
total=0
while IFS= read -r line || [[ -n $line ]]; do
[[ $line =~ ^[0-9]{1,4}$ ]] || exit 2
value=$((10#$line))
(( value <= 1440 )) || exit 2
total=$((total + value))
done < "$file"
printf 'total=%s\n' "$total"预期输出
total=55逐步理解
所有文件路径均加双引号,所以文件名中的空格不影响访问。最后一行没有换行时,read 可能返回失败,但非空条件仍让该行进入处理。数据通过验证后才参与累计。
trap 只删除 mktemp 成功创建的临时目录,不接受用户目录。不要把这个清理命令改成任意路径。若用 cat file | while,循环可能处于子 Shell,外层变量结果就可能与预期不同。
常见问题与边界
- 临时目录创建失败必须停止。
- 管道循环与重定向循环的作用域可能不同。
- 非法行应报告失败,不能静默当成零。
动手练习
让最后一行是没有换行的 10,再把其中一行改成 bad。
参考答案
无换行的最后一行仍会处理,总和为 65;bad 导致状态 2 退出,trap 仍清理目录。计算成功与资源清理是不同验证点。
文章回复
0 条公开回复