解決策 1:
これは非常に可能です。これを実装する非常に簡単な方法は、テンプレート ファイルを実際にスクリプトにして、
などのシェル変数を使用することです。#! /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=$1
を指定して、コマンド ラインでこれを構成可能にすることもできます。 そして path=$2
、したがって、 bash script /foo/bar/baz 1.2.3
のように実行できます . -
行が無視される前にEOFが空白を引き起こす前に、プレーンな <<EOF
を使用してください その動作を望まない場合。
これを行う別の方法は、sed の検索および置換機能を使用することです
#! /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
文字列 VERSION と PATH の各インスタンスを置き換えます。これらの文字列がテンプレート ファイルに含まれる他の理由がある場合は、検索して VERSION に置き換えることができます。 または %VERSION% または何かが誤ってトリガーされる可能性が低くなります。
解決策 2:
Linux CLI でこれを行う最も簡単な方法は、envsubst
を使用することです。 および環境変数。
サンプル テンプレート ファイル apache.tmpl
:
<VirtualHost *:${PORT}>
ServerName ${SERVER_NAME}
ServerAlias ${SERVER_ALIAS}
DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>
envsubst
を実行 結果を新しいファイル my_apache_site.conf
に出力します :
export PORT="443"
export SERVER_NAME="example.com"
export SERVER_ALIAS="www.example.com"
export DOCUMENT_ROOT="/var/www/html/"
envsubst < apache.tmpl > my_apache_site.conf
出力:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/var/www/html/"
</VirtualHost>
解決策 3:
/bin/sh
以外のツールは必要ありません .次の形式のテンプレート ファイルが与えられた場合
Version: ${version}
Path: ${path}
または混合シェルコードが含まれていても
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)
のようなシェル解析可能な構成ファイル
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
確かに、シェル変数 config_file
の構成ファイルへのパスが与えられます template_file
のテンプレート ファイルへのパス 、あなたがする必要があるのは:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
これはおそらく、テンプレート ファイルとして完全なシェル スクリプトを使用するよりも優れています (@mtinberg のソリューション)。
完全な単純なテンプレート拡張プログラム:
#!/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
これにより、展開が標準出力に出力されます。標準出力をファイルにリダイレクトするか、上記を明らかな方法で変更して、目的の出力ファイルを生成するだけです。
注意: ファイルにエスケープされていない二重引用符 ("
) が含まれていると、テンプレート ファイルの展開が機能しませんでした。 )。セキュリティ上の理由から、おそらくいくつかの明白なサニティ チェックを含めるか、テンプレート ファイルが外部エンティティによって生成された場合はシェル エスケープ変換を実行する必要があります。
解決策 4:
新しいファイルを生成するシェル コードではなく、軽量で本物のテンプレートが必要な場合は、通常は sed
を選択します。 &awk
または perl
.ここに 1 つのリンクがあります:http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/
私は、perl、tcl、python、ruby、またはそのクラスの他の何かのような実際の言語を使用します。スクリプト用に構築されたもの。それらはすべて、優れたシンプルなテンプレート ツールと、Google での大量の例を備えています。
解決策 5:
そのためにshtplを使用します。 (私のプライベート プロジェクトです。つまり、広く使用されているわけではありません。しかし、とにかくテストしたい場合があります)
たとえば、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
お楽しみください!