Non sono necessari strumenti diversi da /bin/sh
. Dato un file modello del modulo
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 shell come
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
è semplice estenderlo 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 shell config_file
e il percorso del file modello template_file
, tutto ciò che devi fare è:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Questo è forse più bello di avere uno script di shell completo come file modello (la soluzione di @ mtinberg).
Il programma completo di espansione del modello ingenuo:
#!/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
Ciò genererà l'espansione all'output standard; reindirizzare l'output standard su 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 viene generato da entità esterna.