Tidak ada alat yang diperlukan selain /bin/sh
. Diberikan file templat dari formulir
Version: ${version}
Path: ${path}
atau bahkan dengan kode shell campuran disertakan
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 seperti shell
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
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, mengingat path ke file konfigurasi di variabel shell config_file
dan path ke file template template_file
, semua yang perlu Anda lakukan adalah:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Ini mungkin lebih cantik daripada memiliki skrip shell lengkap sebagai file templat (solusi @ mtinberg).
Program expander template naif 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 menghasilkan ekspansi ke output standar; hanya mengarahkan keluaran standar ke file atau memodifikasi di atas dengan cara yang jelas untuk menghasilkan file keluaran yang diinginkan.
Peringatan: Perluasan file template tidak akan berfungsi jika file berisi tanda kutip ganda yang tidak terhapus ( "
). Untuk alasan keamanan, kami mungkin harus menyertakan beberapa pemeriksaan kewarasan yang jelas atau, lebih baik lagi, melakukan transformasi shell escape jika file templat dihasilkan oleh entitas eksternal.
Cara termudah untuk melakukan ini hanya di Linux CLI adalah dengan menggunakan
envsubst
dan Variabel Lingkungan.Contoh file template
apache.tmpl
:Jalankan
envsubst
dan hasilkan output ke file barumy_apache_site.conf
:Keluaran:
sumber
Anda mungkin harus melihat ke dalam sistem manajemen konfigurasi seperti Wayang atau Koki . Ini dapat dengan mudah melakukan apa yang Anda gambarkan di atas dan banyak lagi.
sumber
name
, string<%= name %>
dalam templat akan diganti denganname
nilai. Bagaimana Anda mendefinisikan diname
luar template berbeda antara kedua sistem, jelas.Jika Anda menginginkan templat yang ringan dan nyata daripada kode shell yang menghasilkan file baru, pilihan yang biasa adalah
sed
&awk
atauperl
. Berikut ini satu tautan: http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/Saya, saya akan menggunakan bahasa nyata seperti perl, tcl, python, ruby atau sesuatu yang lain di kelas itu. Sesuatu dibangun untuk skrip. Mereka semua memiliki alat templating yang bagus dan sederhana dan banyak contoh di google.
sumber
Saya menggunakan shtpl untuk itu. (proyek pribadi saya, yang berarti, itu tidak banyak digunakan. Tapi mungkin Anda ingin mengujinya pula)
Misalnya Anda ingin menghasilkan / etc / network / interfaces dari file csv, Anda dapat melakukannya seperti itu:
Konten file CSV (di sini test.csv):
Templat (di sini interfaces.tpl):
Perintah:
Hasil:
Nikmati!
sumber
Saya meningkatkan jawaban FooF sehingga pengguna tidak perlu menghapus tanda kutip ganda secara manual:
sumber
Baru-baru ini saya menerbitkan skrip bash yang menyelesaikannya hanya dengan menggunakan sintaks template seperti-jinja. Ini disebut cookie . Ini demo:
sumber
Saya mungkin terlambat ke pesta ini. Namun, saya menemukan masalah yang sama dan saya memilih untuk membuat mesin template BASH saya sendiri dalam beberapa baris kode:
Katakanlah Anda memiliki ini
file.template
:Dan
rules
file ini :Anda menjalankan perintah ini:
Anda mendapatkan ini:
Anda dapat menginstalnya dengan:
Ini adalah situs proyek
sumber
Untuk memperluas jawaban hebat @ FooF (baris baru tidak memformat dalam komentar), menggunakan karakter kontrol heredoc +, Anda dapat mengizinkan karakter dan nama file yang berubah-ubah :
Ini menerima karakter non-nol, dan hanya memotong lebih awal jika 3
^D
byte ditemui pada baris mereka sendiri (secara realistis tidak pernah). zsh bahkan mendukung terminator nol, jadiprintf '\x00\x00\x00'
akan bekerja.template
bahkan bekerja untuk nama file berbahaya seperti:Hati-hati templat shell dapat "memperluas" perintah sewenang-wenang, misalnya
$(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))
. Dengan kekuatan besar ...Sunting: jika Anda benar-benar tidak ingin file Anda meluncurkan nuklir pada Anda, hanya
sudo -u nobody sh
(atau pengguna aman lainnya) sebelumnya.sumber