2012-01-12 99 views
6

我正尝试为我们的内部开发服务器自动创建网站创建。如何使用bash从模板生成脚本文件?

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

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

我不只是想使用printf的原因是因为apache配置大概有20行,并且会占用大部分的bash脚本,并且使其更难阅读。

任何帮助表示赞赏。

+0

分开保存原型httpd.conf文件,并让脚本在运行时将模板(原型)文件编辑到实际文件中。当然,这意味着需要两个文件 - 脚本和模板。但它保持两个逻辑上不相交的文件实际上是不相交的。 – 2012-01-12 19:40:21

+0

是的,这就是我所问(抱歉,如果不明确),但我需要知道如何做到这一点。我认为佩特瓦尔加的回答会让我有一些调整。 – Brendan 2012-01-12 20:31:56

回答

7

选择标记参数的方式。一种可能性是: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 

注意,你应该使用一个陷阱,以保证临时不Ø utlive它的用处:

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 

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

+0

这很完美,谢谢。 – Brendan 2012-01-12 21:35:53

1

用sed例如像

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

我将如何用多个不同的值替换多个标记?即%foo%替换为$ foo,%bar%替换为$ bar。 – Brendan 2012-01-12 20:30:09

+1

简单:'sed“s /%foo%/ $ foo/g; s /%bar%/ $ bar/g” – tripleee 2014-11-19 12:28:30

4

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

#!/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 

在这种情况下,我会建议$ {}变量在相当于$变量清晰度和避免任何可能的歧义。