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

查看:151
本文介绍了bash - linux shell脚本 eval 执行变量中有小于号如何处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

在做一个文本模板生成功能时遇到本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

解决方案

以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

这篇关于bash - linux shell脚本 eval 执行变量中有小于号如何处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆