DevCN
菜单
全部文章快讯开发科技深度热点

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 仍清理目录。计算成功与资源清理是不同验证点。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。