微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

你可以使用这个:

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 输入或保留尾随换行符的数量。最后一个变体按原样呈现,因为 shell ‘ove’ 二进制输入:

  1. read将解释反斜杠。
  2. read -r不会解释反斜杠,但如果最后一行不以换行符结尾,它仍然会删除
  3. "$(…)"删除尽可能多的尾随换行符,因此我以 : 结尾; echo -n a使用echo -n "${line:0:-1}":这将删除最后一个字符(即a)并保留与输入中的尾随换行符一样多的尾随换行符(包括否)。

解决方法

我正在编写一个脚本来自动为我自己的网络服务器创建 Apache 和 PHP 的配置文件。我不想使用任何图形用户界面,如 CPanel 或
ISPConfig。

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

  1. 如何替换文本文件中的 ${} 占位符?

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"

顺便说一句,我如何在这里将输出重定向到外部文件?如果变量包含引号,我是否需要转义?

  1. 使用 cat & sed 将每个变量替换为其值:

给定 template.txt(见上文)

命令:

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

对我来说似乎很糟糕,因为需要转义许多不同的符号并且有很多变量,这条线太长了。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。