linux shell脚本 eval 执行变量中有小于号如何处理

发布于 2022-09-05 09:48:16 字数 1442 浏览 16 评论 0

在做一个文本模板生成功能时遇到本SHELL定义的变量替换模板文件中变量标识符的问题
以下为简化版脚本。功能要求两个模板文件详见16:19分隔线以下内容。

t_content="http://HelloWorld.com";
# t_file的值实际是从模板文件读出,所以为单引号不能直接替换变量
t_file='<a href="${t_content}">${t_content}</a>';

# 实现方法
eval t_result=$(echo "${t_file}");

# 期望结果
echo ${t_result};

期望可以打印出

<a href="http://HelloWorld.com">http://HelloWorld.com</a>

实际会提示执行出错

-bash: syntax error near unexpected token `newline'

改为以下 内容不会出错

t_content="http://HelloWorld.com";
t_file='==${t_content}==!!';
eval t_result=$(echo "${t_file}");
echo ${t_result};

请各位同学帮忙修改实现方法,成分感谢。


16:19
本脚本实现功能为根据模板生成html文件
文件夹结构为:
mail.htm 模板文件,生成的html文件基于此模板文件结构添加变量实现

<html><body>
<p>${title}</p>
<a href="${addr}">${addr}</a>
<table></table>
</body></html>

mail.ini 配置文件,用于配置模板文件使用的值内容

title=这是一个测试脚本
addr=http://HelloWorl.com

runtask.sh 执行脚本,用于执行模板值替换

#!/bin/bash
source ./mail.ini
content=""
> ./target.html
while read line;
do
    # 此处为本问题发生点,用于替换模板文件中的变量
    # 考虑到后期模板文件会很大,ini配置文件中变量会非常多,所以无法固定死。
    eval content=$(echo "${line}")
    
    echo ${content} >> ./target.html
done < ./mail.htm

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉殇 2022-09-12 09:48:16

以16:19分隔符为界修改后脚本如下:
本脚本实现功能为根据模板生成html文件
文件夹结构为:
mail.htm 模板文件,生成的html文件基于此模板文件结构添加变量实现

<html><body>
<p>${title}</p>
<a href="${addr}">${addr}</a>
<table></table>
</body></html>

mail.ini 配置文件,用于配置模板文件使用的值内容

title=这是一个测试脚本
addr=http://HelloWorl.com

runtask.sh 执行脚本,用于执行模板值替换

#!/bin/bash
source ./mail.ini
content=""
cat ./mail.htm > ./target.html
while read line;
do
    sed -i 's^${'"${line%%=*}"'}^'"$(eval echo '${'${line%%=*}'}')^g;" ./target.html
done < ./mail.ini
爱*していゐ 2022-09-12 09:48:16

没那么复杂。

t_content="http://HelloWorld.com"
t_file="<a href=\"${t_content}\">${t_content}</a>"
t_result=${t_file}
echo ${t_result}
<a href="http://HelloWorld.com">http://HelloWorld.com</a>
while read line;do t_file=${t_file}${line};sed 's/"/\\"/g' ${t_file};done;<test.htm
纸伞微斜 2022-09-12 09:48:16

可以这样试试:

t_content="http://HelloWorld.com"
t_file='<a href="${t_content}">${t_content}</a>'
#变量扩展打印:
echo ${t_file//\$\{t_content\}/${t_content}}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文