J'ai besoin d'un système de template très basique dans shell pour porter un programme d'installation Windows sur linux. Je ne peux donc pas changer la syntaxe des variables du modèle.Construire un script sed à partir de variables d'environnement spécifiques
Je veux prendre des variables d'environnement spécifiques (en commençant par $ ENV_PREFIX) et construire un script sed de la forme s/@@@${TEMPLATE_VARIABLE}@@@/$VALUE_OF_ENVIRONMENT_VARIABLE/
. $ TEMPLATE_VARIABLE est le nom de la variable d'environnement avec le $ ENV_PREFIX effacé.
#!/usr/bin/env sh # no bashisms please!
TEMPLATE_FILE=$1
ENV_PREFIX="DMTMPL_"
SED_SCRIPT=""
OIFS="$IFS"
IFS=$'\012'
for VAR in "$(env | grep "^${ENV_PREFIX}")"
do
VARIABLE=$(echo $VAR | cut -d= -f1 | cut -d_ -f2-)
SED_SCRIPT="${SED_SCRIPT}\ns/${VARIABLE}/${???}/g"
done
echo ${SED_SCRIPT}
# invoke sed with $SED_SCRIPT on $TEMPLATE_FILE
Maintenant, j'ai toutes sortes de problèmes avec ce script:
- J'ai essayé de faire
env --null
, mais n'a pas pu combiner avec le grep suivant. - La boucle ne correspond pas exactement gérer une variable d'environnement dans chaque boucle
- Je n'ai pas réussi à avoir SED_SCRIPT $ bien séparé avec les nouvelles lignes
- Comment puis-je accéder à la valeur d'une variable lorsque le nom de la variable est stockée dans une autre variable? C'est ce que j'ai besoin de mettre où ??? sont dans le script.
Je pensais écrire un script shell rapide pour cela, mais maintenant je me souviens pourquoi je déteste les scripts shell ... :-(
Ces questions semblent répondre à une partie de ma question:
Avant de répondre, pourquoi rechigne-vous sur "bashismes"? puisque vous les utilisez vous-même, par ex. $ (env | grep ...) est un bashisme –
Le script ne doit pas dépendre de bash mais s'exécuter par exemple. sur le tiret qui pointe vers sur Debian. Je ne suis pas si facile à reconnaître tous les bashims moi-même. –
tiret sera bien avec la solution que j'ai fournie ci-dessous, en fait cela devrait fonctionner sur le vieux shell korn et shell Bourne original aussi bien. jetez un oeil –