加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash模板:如何使用Bash从模板构建配置文件?

发布时间:2020-12-15 16:45:27 所属栏目:安全 来源:网络整理
导读:我编写一个脚本来自动为我自己的网络服务器创建Apache和PHP的配置文件。我不想使用任何GUI像CPanel或ISPConfig。 我有一些Apache和PHP配置文件的模板。 Bash脚本需要读取模板,使变量替换和输出解析的模板到某个文件夹。什么是最好的方法呢?我可以想几种方
我编写一个脚本来自动为我自己的网络服务器创建Apache和PHP的配置文件。我不想使用任何GUI像CPanel或ISPConfig。

我有一些Apache和PHP配置文件的模板。 Bash脚本需要读取模板,使变量替换和输出解析的模板到某个文件夹。什么是最好的方法呢?我可以想几种方法。哪一个是最好的或可能有一些更好的方法来做到这一点?我想在纯Bash(这很容易在PHP中)

1)How to replace ${} placeholders in a text file?

template.txt:

the number is ${i}
the word is ${word}

script.sh:

#!/bin/sh

#set variables
i=1
word="dog"
#read in template one line at the time,and replace variables
#(more natural (and efficient) way,thanks to Jonathan Leffler)
while read line
do
    eval echo "$line"
done < "./template.txt"

BTW,我如何将输出重定向到外部文件?如果变量包含,例如,引号,我需要转义吗?

2)使用cat& sed用每个变量的值替换:

给定template.txt:

The number is ${i}
The word is ${word}

命令:

cat template.txt | sed -e "s/${i}/1/" | sed -e "s/${word}/dog/"

似乎对我不好,因为需要逃脱许多不同的符号和许多变量的线将太tooo长。

你能想到一些其他优雅和安全的解决方案吗?

您可以使用:
perl -p -i -e 's/${([^}]+)}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < template.txt

用相应的环境变量替换所有$ {…}字符串(不要忘记在运行此脚本之前导出它们)。

对于纯bash这应该工作(假设变量不包含$ {…}字符串):

#!/bin/bash
while read -r line ; do
    while [[ "$line" =~ (${[a-zA-Z_][a-zA-Z_0-9]*}) ]] ; do
        LHS=${BASH_REMATCH[1]}
        RHS="$(eval echo ""$LHS"")"
        line=${line//$LHS/$RHS}
    done
    echo "$line"
done

。解决方案不挂起,如果RHS引用一些引用自身的变量:

#!/bin/bash
line="$(cat; echo -n a)"
end_offset=${#line}
while [[ "${line:0:$end_offset}" =~ (.*)(${([a-zA-Z_][a-zA-Z_0-9]*)})(.*) ]] ; do
    PRE="${BASH_REMATCH[1]}"
    POST="${BASH_REMATCH[4]}${line:$end_offset:${#line}}"
    VARNAME="${BASH_REMATCH[3]}"
    eval 'VARVAL="$'$VARNAME'"'
    line="$PRE$VARVAL$POST"
    end_offset=${#PRE}
done
echo -n "${line:0:-1}"

警告:我不知道一种方法来正确处理bash中的NUL的输入,或保留尾随换行符的数量。最后一个变体是因为它是因为“爱”二进制输入:

> read将解释反斜杠。> read -r不会解释反斜杠,但如果最后一行没有以换行符结束,它仍会丢弃。>“$(…)”将剥离与存在的许多尾随换行符,所以我结束… with; echo -n a并使用echo -n“$ {line:0:-1}”:这将删除最后一个字符(它是一个),并保留与输入(包括否)一样多的尾随换行。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读