GNU/Linux >> Linux Esercitazione >  >> Linux

Creazione di modelli con Linux in uno script Shell?

Soluzione 1:

Questo è molto possibile. Un modo molto semplice per implementare questo sarebbe che il file modello sia effettivamente lo script e utilizzi variabili di shell come

#! /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

Puoi persino renderlo configurabile sulla riga di comando specificando version=$1 e path=$2 , quindi puoi eseguirlo come bash script /foo/bar/baz 1.2.3 . Il - prima che EOF faccia sì che gli spazi bianchi prima che le righe vengano ignorate, usa il semplice <<EOF se non vuoi quel comportamento.

Un altro modo per farlo sarebbe utilizzare la funzionalità di ricerca e sostituzione di 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

che sostituirà ogni istanza delle stringhe VERSION e PATH. Se ci sono altri motivi per cui quelle stringhe sarebbero nel file modello, potresti fare in modo che la tua ricerca e sostituzione sia VERSION o %VERSION% o qualcosa che ha meno probabilità di essere attivato accidentalmente.

Soluzione 2:

Il modo più semplice per farlo semplicemente nella CLI di Linux è usare envsubst e variabili d'ambiente.

File modello di esempio apache.tmpl :

<VirtualHost *:${PORT}>
    ServerName ${SERVER_NAME}
    ServerAlias ${SERVER_ALIAS}
    DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>

Esegui envsubst e invia il risultato al nuovo file 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

Uscita:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/var/www/html/"
</VirtualHost>

Soluzione 3:

Non sono necessari strumenti diversi da /bin/sh . Dato un file modello della forma

Version: ${version}
Path: ${path}

o anche con codice shell misto incluso

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)

e un file di configurazione analizzabile dalla shell come

version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"

è semplice espanderlo a

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

Infatti, dato il percorso del file di configurazione nella variabile di shell config_file e il percorso del file modello in template_file , tutto ciò che devi fare è:

. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""

Questo è forse più bello che avere uno script di shell completo come file modello (@mtinberg's solution).

Il programma di espansione del modello ingenuo completo:

#!/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

Questo produrrà l'espansione all'output standard; basta reindirizzare l'output standard a un file o modificare quanto sopra in modo ovvio per produrre il file di output desiderato.

Avvertenze: L'espansione del file modello non funzionerebbe se il file contenesse virgolette doppie senza escape (" ). Per motivi di sicurezza, dovremmo probabilmente includere alcuni ovvi controlli di integrità o, ancora meglio, eseguire la trasformazione di escape della shell se il file modello è generato da un'entità esterna.

Soluzione 4:

Se vuoi modelli leggeri e reali piuttosto che codice shell che genera nuovi file, le solite scelte sono sed &awk o perl . Ecco un link:http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/

Io userei un vero linguaggio come perl, tcl, python, ruby ​​o qualcos'altro in quella classe. Qualcosa costruito per lo scripting. Hanno tutti buoni e semplici strumenti di creazione di modelli e tonnellate di esempi su Google.

Soluzione 5:

Uso shtpl per questo. (mio progetto privato, il che significa che non è ampiamente utilizzato. Ma forse vuoi testarlo comunque)

Ad esempio, se vuoi generare un /etc/network/interfaces da un file csv, puoi farlo in questo modo:

Contenuto del file CSV (qui 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

Modello (qui interfaces.tpl):

#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1 
iface $Val1 inet static
  address $Val2 
  netmask $Val3 
  gateway $Val4 

#% done < "$CSVFILE"

Comando:

$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"

Risultato:

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

Buon divertimento!


Linux
  1. Ordina il comando in Linux con esempi

  2. Permessi dei file in Linux con esempio

  3. Controlla i permessi dei file Linux con ls

  4. Lettura di un file CSV con query SQL dalla shell Linux

  5. Script di traslitterazione per shell linux

Che cos'è Shebang negli script della shell di Linux?

Utilizzo del comando Linux mv con esempi

Proteggi Linux con il file Sudoers

Comando di montaggio Linux con esempi

Comando gawk Linux con esempi

Linux make Command con esempi