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"."