如何用 Bash 脚本安全生成 HTML 表格(修复语法错误与最佳实践)

本文详解 bash 中 while-read 循环生成 html 表格时常见的语法错误(如 `do` 位置错误),提供可运行的修正代码,并补充引号保护、字段分隔、html 转义等生产级注意事项。

Bash 脚本中通过读取文本文件动态生成 HTML 表格是一种常见需求,但语法细节极易出错。你遇到的报错:

./table_html.csv: line 36: syntax error near unexpected token `echo'

根本原因是 do 关键字必须紧跟在 while 条件之后(同一行或紧随换行),不可前置换行或缩进。原始代码中 while read row do 被错误拆分为两行(while read row 换行后才写 do),导致 Shell 解析器无法识别循环结构,进而将后续 echo 误判为语法异常。

✅ 正确写法(do 紧跟 while 后):

file="output.html"
echo "" > "$file"  # 先写表头,覆盖旧文件

while read -r row; do
    echo "" >> "$file"
    # 按空格分割字段(若含空格,请改用 IFS 或 awk)
    for valore in $row; do
        # 安全转义:防止 HTML 特殊字符破坏结构
        escaped=$(printf '%s' "$valore" | sed 's/&/\&/g; s//\youjiankuohaophpcn/g; s/"/\"/g')
        echo "" >> "$file"
    done
    echo "" >> "$file"
done < alunni.txt

echo "
$escaped
" >> "$file"

⚠️ 关键注意事项:

  • 始终引用变量:使用 "$file" 而非 $file,避免路径含空格时崩溃;
  • 启用 -r 选项:read -r 防止反斜杠被误解析(如文件名含 \t);
  • 字段分隔需明确:默认按空白符(空格/制表符)分割。若 alunni.txt 是 CSV(逗号分隔),应改用:
    while IFS=',' read -r nome cognome eta; do
        echo "$nome$cognome$eta" >> "$file"
    done < alunni.txt
  • HTML 安全性:直接插入未过滤的 $valore 可能引发 XSS 或标签错乱,务必对 , &, " 做实体转义(如上 sed 示例);
  • 编码与声明:建议在 前添加 HTML5 声明和 UTF-8 元信息:
    echo '
    ' > "$file"
    # ... 表格生成逻辑 ...
    echo '' >> "$file"

    总结:Bash 生成 HTML 的核心是“语法严谨 + 输入可控 + 输出安全”。修复 do 位置只是起点,结合引号、转义和明确分隔符,才能写出健壮、可维护的脚本。