GNU/Linux >> Belajar Linux >  >> Linux

Membuat template dengan Linux dalam Shell Script?

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!


Linux
  1. Urutkan Perintah di Linux dengan Contoh

  2. Cara mengubah kata dalam file dengan skrip shell linux

  3. Skrip transliterasi untuk shell linux

  1. Bagaimana Membuat File Sementara Di Shell Script?

  2. Izin File di Linux dengan Contoh

  3. Periksa izin file Linux dengan ls

  1. Shell Scripting Bagian I:Memulai dengan bash scripting

  2. Membaca file CSV dengan kueri SQL dari linux shell

  3. Bisakah file .sh menjadi malware?