Solusi 1:
Ini sangat mungkin. Cara yang sangat sederhana untuk mengimplementasikan ini adalah agar file template benar-benar menjadi skrip dan menggunakan variabel shell seperti
#! /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
Anda bahkan dapat membuat ini dapat dikonfigurasi pada baris perintah dengan menentukan version=$1
dan path=$2
, sehingga Anda dapat menjalankannya seperti bash script /foo/bar/baz 1.2.3
. -
sebelum EOF menyebabkan spasi putih sebelum baris diabaikan, gunakan <<EOF
biasa jika Anda tidak menginginkan perilaku itu.
Cara lain untuk melakukannya adalah dengan menggunakan fungsi pencarian dan penggantian 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
yang akan menggantikan setiap instance string VERSION dan PATH. Jika ada alasan lain mengapa string tersebut ada di file template, Anda dapat melakukan pencarian dan menggantinya menjadi VERSION atau %VERSION% atau sesuatu yang kecil kemungkinannya dipicu secara tidak sengaja.
Solusi 2:
Cara termudah untuk melakukannya di Linux CLI adalah dengan menggunakan envsubst
dan Variabel Lingkungan.
Contoh file template apache.tmpl
:
<VirtualHost *:${PORT}>
ServerName ${SERVER_NAME}
ServerAlias ${SERVER_ALIAS}
DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>
Jalankan envsubst
dan hasil keluaran ke file baru 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
Keluaran:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/var/www/html/"
</VirtualHost>
Solusi 3:
Tidak diperlukan alat selain /bin/sh
. Diberi file template formulir
Version: ${version}
Path: ${path}
atau bahkan dengan menyertakan kode shell campuran
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)
dan file konfigurasi yang dapat diuraikan shell seperti
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
itu adalah masalah sederhana untuk memperluas ini ke
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
Memang, diberikan path ke file konfigurasi di variabel shell config_file
dan path ke file template di template_file
, yang perlu Anda lakukan hanyalah:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Ini mungkin lebih cantik daripada memiliki skrip shell lengkap sebagai file template (@solusi mtinberg).
Program expander template naif yang lengkap:
#!/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
Ini akan menampilkan perluasan ke keluaran standar; cukup arahkan output standar ke file atau modifikasi di atas dengan cara yang jelas untuk menghasilkan file output yang diinginkan.
Peringatan: Ekspansi file template tidak akan berfungsi jika file berisi tanda kutip ganda yang tidak lolos ("
). Untuk alasan keamanan, kami mungkin harus menyertakan beberapa pemeriksaan kewarasan yang jelas atau, lebih baik lagi, melakukan transformasi pelolosan shell jika file template dihasilkan oleh entitas eksternal.
Solusi 4:
Jika Anda menginginkan template yang ringan dan nyata daripada kode shell yang menghasilkan file baru, pilihan biasanya adalah sed
&awk
atau perl
. Ini satu tautan:http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/
Saya, saya akan menggunakan bahasa asli seperti perl, tcl, python, ruby atau yang lainnya di kelas itu. Sesuatu yang dibangun untuk scripting. Semuanya memiliki alat pembuatan template yang bagus dan sederhana serta banyak contoh di google.
Solusi 5:
Saya menggunakan shtpl untuk itu. (proyek pribadi saya, artinya, ini tidak digunakan secara luas. Tapi mungkin Anda tetap ingin mengujinya)
Misalnya Anda ingin membuat /etc/network/interfaces dari file csv, Anda dapat melakukannya seperti itu:
Konten file CSV (di sini 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
Templat (di sini interfaces.tpl):
#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1
iface $Val1 inet static
address $Val2
netmask $Val3
gateway $Val4
#% done < "$CSVFILE"
Perintah:
$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"
Hasil:
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
Selamat menikmati!