如何编写脚本输出HTML文件?Bash脚本变量未解析问题求助
问题分析与解决方法
你碰到的核心问题是Here Document( heredoc)的引号使用方式——当你用'EOF'作为分界符时,Bash会将整个 heredoc 内容当作纯文本,完全不会解析其中的变量、命令替换或者转义字符,所以${ec_1}和${ec_2}会原封不动地写入HTML文件。
另外你的脚本里还有两个小问题需要修正:
ec_2变量没有正确初始化,当前写法是直接把命令输出重定向到$ec_2,但此时变量未定义,会导致错误if条件里的命令可以优化,避免不必要的管道操作
修改后的完整脚本
#!/bin/bash cat << EOF > 01.html <html> <head> <title>HTML Convert</title> </head> <body> EOF ec_1="====Default ID====" # 用egrep -c直接统计匹配行数,替代cat+egrep+wc的组合 if [ $(egrep -c "lp:|uucp:|nuccp:" /etc/passwd) -eq 0 ]; then # 用命令替换$(...)把命令结果赋值给ec_2 ec_2=$(egrep "lp:|uucp:|nuccp:" /etc/passwd) else # 可以给ec_2设置一个默认值,避免没有匹配时变量为空 ec_2="No matching users found" fi cat << EOF >> 01.html <h1>${ec_1}</h1> <h5>${ec_2}</h5> </body> </html> EOF
关键修改说明
- 去掉heredoc分界符的单引号:把
'EOF'改成EOF,这样Bash会解析 heredoc 内部的变量和命令替换,${ec_1}和${ec_2}就会被替换成实际的变量值。 - 修正
ec_2的赋值方式:使用$(command)的命令替换语法,把egrep的输出结果直接赋值给ec_2,而不是用重定向。 - 优化条件判断命令:用
egrep -c直接统计匹配的行数,省去了cat和wc命令,让代码更简洁高效。 - 添加else分支:避免当有匹配结果时
ec_2未赋值,确保HTML里不会出现空的<h5>标签。
这样修改后,生成的01.html就会正确显示变量的内容,而不是原始的变量名了。
内容的提问来源于stack exchange,提问作者leej0978
相关产品推荐
相关产品推荐

