GNU/Linux >> Linux の 問題 >  >> Linux

シェル スクリプトで Linux を使用してテンプレートを作成しますか?

解決策 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

お楽しみください!


Linux
  1. Linuxでの並べ替えコマンドと例

  2. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?

  3. Linuxでのファイルパーミッションと例

  1. lsでLinuxファイルのパーミッションを確認する

  2. Linuxシェルスクリプトでファイル内の単語を変更する方法

  3. LinuxシェルからのSQLクエリを含むCSVファイルの読み取り

  1. シェルスクリプトパートI:bashスクリプトの開始

  2. Linux シェルの音訳スクリプト

  3. .sh ファイルがマルウェアになる可能性はありますか?