在Shell脚本中使用Linux进行模板化?

我想说的是:

1.)有一个configuration文件作为模板,像variables$版本$path(例如apacheconfiguration)

2.)有一个shell脚本“填充”模板的variables,并将生成的文件写入磁盘。

这是可能与一个shell脚本。 如果你能命名一些命令/工具,我可以完成这个或一些好的链接,我会非常感谢。

这是非常可能的。 一个非常简单的方法来实现这个将模板文件实际上是脚本和使用shellvariables如

#! /bin/bash version="1.2.3" path="/foo/bar/baz" cat > /tmp/destfile <<-EOF here is some config for version $version which should also reference this path $path EOF 

你甚至可以通过指定version=$1path=$2来在命令行上进行configuration,所以你可以像bash script /foo/bar/baz 1.2.3那样运行它。 在EOF之前,在忽略这些行之前会产生空格,如果您不想要这种行为,请使用普通的<<EOF

另一种方法是使用sed的search和replacefunction

 #! /bin/bash version="1.2.3" path="/foo/bar/baz" sed -e "s/VERSION/$version/g" -e "s/PATH/$path/" /path/to/templatefile > /tmp/destfile 

这将取代stringVERSION和PATH的每个实例。 如果这些string存在于模板文件中还有其他原因,则可能会使您的search和replace变为VERSION或%VERSION%,或者不太可能被意外触发。

/bin/sh以外不需要其他工具。 给定一个表单的模板文件

 Version: ${version} Path: ${path} 

甚至包括混合的shell代码

 Version: ${version} Path: ${path} Cost: ${cost}\$ $(i=1; for w in one two three four; do echo Param${i}: ${w}; i=$(expr $i + 1); done) 

和一个shell可parsing的configuration文件一样

 version="1.2.3-r42" path="/some/place/under/the/rainbow/where/files/dance/in/happiness" cost="42" 

把它扩展到一个简单的问题

 Version: 1.2.3-r42 Path: /some/place/under/the/rainbow/where/files/dance/in/happiness Cost: 42$ Param1: one Param2: two Param3: three Param4: four 

事实上,给定shellvariablesconfig_fileconfiguration文件的path以及template_file中模板文件的path,您所需要做的就是:

 . ${config_file} template="$(cat ${template_file})" eval "echo \"${template}\"" 

这可能比完整的shell脚本作为模板文件(@ mtinberg的解决scheme)更漂亮。

完整的天真模板扩展程序:

 #!/bin/sh PROG=$(basename $0) usage() { echo "${PROG} <template-file> [ <config-file> ]" } expand() { local template="$(cat $1)" eval "echo \"${template}\"" } case $# in 1) expand "$1";; 2) . "$2"; expand "$1";; *) usage; exit 0;; esac 

这将输出扩展到标准输出; 只是将标准输出redirect到一个文件或者以明显的方式修改上面的内容以产生所需的输出文件。

注意事项:如果文件中包含未转义的双引号( " ),则模板文件扩展将不起作用。出于安全原因,如果模板文件是由外部实体生成的,我们应该包含一些明显的完整性检查,甚至更好的是执行shell转义转换。

您可能应该考虑像木偶或厨师这样的configurationpipe理系统。 这些可以很容易地做你以上描述和更多。

我使用shtpl 。 (我的私人项目,这意味着它没有被广泛使用,但也许你想要testing它)

例如你想从csv文件中生成一个/ etc / network / interfaces,你可以这样做:

CSV文件内容(这里是test.csv):

 eth0;10.1.0.10;255.255.0.0;10.1.0.1 eth1;192.168.0.10; 255.255.255.0;192.168.0.1 

模板(这里是interfaces.tpl):

 #% IFS=';' #% while read "Val1" "Val2" "Val3" "Val4"; do auto $Val1 iface $Val1 inet static address $Val2 netmask $Val3 gateway $Val4 #% done < "$CSVFILE" 

命令:

 $ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )" 

结果:

 auto eth0 iface eth0 inet static address 10.1.0.10 netmask 255.255.0.0 gateway 10.1.0.1 auto eth1 iface eth1 inet static address 192.168.0.10 netmask 255.255.255.0 gateway 192.168.0.1 

请享用!

如果你想要轻量级和真正的模板,而不是生成新文件的shell代码,通常的select是sedawkperl 。 这是一个链接: http : //savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/

我会用perl,tcl,python,ruby或者其他类的真正的语言。 为脚本构build的东西。 他们都有好的,简单的模板工具和谷歌的例子。