Je voulais initialiser certaines chaînes en haut de mon script avec des variables qui n'ont pas encore été définies, telles que :
str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'
puis plus tard sur PLACE
, EVENT
, ACTION
, et RESULT
sera défini. Je veux ensuite pouvoir imprimer mes chaînes avec les variables développées. Est ma seule option eval
? Cela semble fonctionner :
eval "echo ${str1}"
est-ce la norme ? Y a-t-il une meilleure manière de faire cela? Ce serait bien de ne pas exécuter eval
étant donné que les variables peuvent être n'importe quoi.
Réponse acceptée :
Avec le type d'entrée que vous montrez, la seule façon de tirer parti de l'expansion du shell pour substituer des valeurs dans une chaîne est d'utiliser eval
sous une certaine forme. Ceci est sûr tant que vous contrôlez la valeur de str1
et peut s'assurer qu'il ne référence que des variables connues comme sûres (ne contenant pas de données confidentielles) et ne contient aucun autre caractère spécial du shell sans guillemets. Vous devez développer la chaîne entre guillemets doubles ou dans un document ici, de cette façon uniquement "$`
sont spéciaux (ils doivent être précédés d'un dans
str1
).
eval "substituted="$str1""
Il serait beaucoup plus robuste de définir une fonction au lieu d'une chaîne.
fill_template () {
sentence1="I went to ${PLACE} and saw ${EVENT}"
sentence2="If you do ${ACTION} you will ${RESULT}"
}
Définissez les variables puis appelez la fonction fill_template
pour définir les variables de sortie.
PLACE=Sydney; EVENT=fireworks
ACTION='not learn from history'; RESULT='have to relive history'
fill_template
echo "During my holidays, $sentence1."
echo "Cicero said: "$sentence2"."