Aucun outil nécessaire autre que /bin/sh
. Étant donné un fichier modèle du formulaire
Version: ${version}
Path: ${path}
ou même avec un code shell mixte inclus
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)
et un fichier de configuration shell analysable comme
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
il est simple de l'étendre à
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
En effet, étant donné le chemin d'accès au fichier de configuration dans la variable shell config_file
et le chemin d'accès au fichier modèle dans template_file
, il vous suffit de:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
C'est peut-être plus joli que d'avoir un script shell complet comme fichier modèle (solution de @ mtinberg).
Le programme d'extension de modèles naïf complet:
#!/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
Cela produira l'extension à la sortie standard; redirigez simplement la sortie standard vers un fichier ou modifiez ce qui précède de manière évidente pour produire le fichier de sortie souhaité.
Avertissements: l' expansion du fichier modèle ne fonctionnerait pas si le fichier contenait des guillemets doubles ( "
). Pour des raisons de sécurité, nous devrions probablement inclure des vérifications de cohérence évidentes ou, mieux encore, effectuer une transformation d'échappement du shell si le fichier modèle est généré par une entité externe.