Bash遍历目录HTML文件的For循环导致内容丢失如何解决?
错误原因分析
- if条件语法错误
Bash中字符串比较判断必须放在[]或[[]]结构中,你写的if $f = index.html会被shell解析为「执行名为$f的命令,传入参数=和index.html」,该命令必然执行失败,导致if分支永远不触发,index.html永远不会被跳过。 - 路径匹配逻辑错误
你定义的FILES是带完整路径的通配符,遍历得到的$f是类似/run/media/george/General/testing/xxx.html的全路径字符串,就算if语法正确,拿全路径和纯文件名index.html比较也永远为假,不可能跳过目标目录下的index.html。 - 相对路径读取错误
脚本中head -n 51 index.html用的是相对路径,如果你执行脚本时的工作目录不是/run/media/george/General/testing/,会读取不到正确的index.html文件,head命令执行失败会导致拼接内容为空。 - 变量未加引号保护
所有$f没有用双引号包裹,当文件名包含空格、特殊字符时会被shell拆分为多个参数,极端情况下会导致tail命令读取空输入,输出内容为空,最终生成的临时文件内容异常。
修复后可正常运行的代码
# 先切换到目标目录,避免相对路径问题 cd /run/media/george/General/testing/ || exit 1 for f in *.html; do # 修正if判断语法,直接匹配纯文件名 if [[ "$f" == "index.html" ]] then echo "skip main file" else echo "Updating $f file..." tmp=$(mktemp) && { head -n 51 index.html; tail -n +52 "$f"; } > "$tmp" && mv -- "$tmp" "$f" fi done
内容的提问来源于stack exchange,提问作者George Johnson
相关产品推荐
相关产品推荐

