如何解决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’ 二进制输入:
-
read
将解释反斜杠。 -
read -r
不会解释反斜杠,但如果最后一行不以换行符结尾,它仍然会删除。 -
"$(…)"
将删除尽可能多的尾随换行符,因此我以 : 结尾…
并; echo -n a
使用echo -n "${line:0:-1}"
:这将删除最后一个字符(即a
)并保留与输入中的尾随换行符一样多的尾随换行符(包括否)。
解决方法
我正在编写一个脚本来自动为我自己的网络服务器创建 Apache 和 PHP 的配置文件。我不想使用任何图形用户界面,如 CPanel 或
ISPConfig。
我有一些 Apache 和 PHP 配置文件的模板。Bash
脚本需要读取模板,进行变量替换并将解析的模板输出到某个文件夹中。最好的方法是什么?我可以想到几种方法。哪一个是最好的,或者可能有更好的方法来做到这一点?我想在纯
Bash 中做到这一点(例如在 PHP 中很容易)
- 如何替换文本文件中的 ${} 占位符?
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"
顺便说一句,我如何在这里将输出重定向到外部文件?如果变量包含引号,我是否需要转义?
- 使用 cat & sed 将每个变量替换为其值:
给定 template.txt(见上文)
命令:
cat template.txt | sed -e "s/\${i}/1/" | sed -e "s/\${word}/dog/"
对我来说似乎很糟糕,因为需要转义许多不同的符号并且有很多变量,这条线太长了。
你能想到其他一些优雅和安全的解决方案吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。