Chtěl jsem inicializovat některé řetězce v horní části mého skriptu s proměnnými, které ještě nebyly nastaveny, jako například:
str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'
a později na PLACE
, EVENT
, ACTION
a RESULT
bude nastaveno. Chci pak mít možnost vytisknout své řetězce s rozšířenými proměnnými. Je moje jediná možnost eval
? Zdá se, že to funguje:
eval "echo ${str1}"
je to standard? existuje lepší způsob, jak to udělat? Bylo by hezké nespouštět eval
s ohledem na proměnné může být cokoliv.
Přijatá odpověď:
S typem vstupu, který zobrazíte, je jediným způsobem, jak využít expanzi shellu k nahrazení hodnot do řetězce, použít eval
v nějaké formě. To je bezpečné, pokud ovládáte hodnotu str1
a může zajistit, že odkazuje pouze na proměnné, které jsou známé jako bezpečné (neobsahující důvěrná data) a neobsahují žádné další speciální znaky shellu neuvedené v uvozovkách. Řetězec byste měli rozbalit uvnitř dvojitých uvozovek nebo v dokumentu here, tak pouze "$`
jsou speciální (musí jim předcházet v
str1
).
eval "substituted="$str1""
Bylo by mnohem robustnější definovat funkci namísto řetězce.
fill_template () {
sentence1="I went to ${PLACE} and saw ${EVENT}"
sentence2="If you do ${ACTION} you will ${RESULT}"
}
Nastavte proměnné a poté zavolejte funkci fill_template
pro nastavení výstupních proměnných.
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"."