如何使用bash从模板编写脚本文件?

时间:2012-01-12 19:36:56

标签: bash sed awk printf

我正在尝试为我们的内部开发服务器自动设置网站创建。

目前,这包括创建系统用户,mysql用户,数据库和apache配置。我知道如何在一个bash文件中完成所有操作,但我想问一下是否有办法更清晰地生成apache配置。

基本上我想要做的是基于模板生成conf文件,类似于使用printf。我当然可以使用printf,但我认为可能有一种更干净的方式,使用sed或awk。

我之所以不想使用printf是因为apache配置大约需要20行,并且会占用大部分bash脚本,并且使其更难阅读。

感谢任何帮助。

3 个答案:

答案 0 :(得分:9)

选择标记参数的方法。一种可能性是:parameter:,但任何类似的标记对都不会与模板文件的合法文本混淆。

写一个sed脚本(sedawkperl,......),类似于以下内容:

sed -e "s/:param1:/$param1/g" \
    -e "s/:param2:/$param2/g" \
    -e "s/:param3:/$param3/g" \
    httpd.conf.template > $HTTPDHOME/etc/httpd.conf

如果你有时需要编辑某些东西,有时却没有,你可能会发现在命令文件中创建相关的sed命令然后执行它更容易:

{
echo "s/:param1:/$param1/g"
echo "s/:param2:/$param2/g"
echo "s/:param3:/$param3/g"
if [ "$somevariable" = "somevalue" ]
then echo "s/normaldefault/somethingspecial/g"
fi
} >/tmp/sed.$$
sed -f /tmp/sed.$$ httpd.conf.template > $HTTPDHOME/etc/httpd.conf

请注意,您应该使用陷阱来确保临时不会超过其有用性:

tmp=/tmp/sed.$$   # Consider using more secure alternative schemes
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15  # aka EXIT HUP INT QUIT PIPE TERM
...code above...
rm -f $tmp
trap 0

这可确保在脚本退出时删除临时文件以获取最可信的信号。您可以保留先前命令的非零退出状态,并在exit $exit_status命令后使用trap 0

答案 1 :(得分:5)

我很惊讶这里没有人提到的文件。这可能不是OP想要的,但肯定是一种提高你开始使用的脚本的易读性的方法。只需注意逃避或参数化掉shell将执行替换的任何构造。

#!/bin/sh
# For example's sake, a weird value
# This is in single quotes, to prevent substitution
literal='$%"?*=`!!'
user=me

cat <<HERE >httpd.conf
# Not a valid httpd.conf
User=${user}
Uninterpolated=${literal}
Escaped=\$dollar
HERE

在这种情况下,为了清晰起见,我建议在等价的$变量上使用$ {variable},以避免任何可能的歧义。

答案 2 :(得分:1)

使用sed,例如

sed s/%foo%/$foo/g template.conf > $newdir/httpd.conf