Ich wollte einige Zeichenfolgen am Anfang meines Skripts mit Variablen initialisieren, die noch nicht festgelegt wurden, wie zum Beispiel:
str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'
und dann später auf PLACE
, EVENT
, ACTION
und RESULT
wird gesetzt. Ich möchte dann in der Lage sein, meine Zeichenfolgen mit den erweiterten Variablen auszudrucken. Ist meine einzige Option eval
? Das scheint zu funktionieren:
eval "echo ${str1}"
ist das Standard? gibt es einen besseren Weg, dies zu tun? Es wäre schön, eval
nicht auszuführen wenn man bedenkt, dass die Variablen alles sein könnten.
Akzeptierte Antwort:
Mit der Art der Eingabe, die Sie zeigen, ist die einzige Möglichkeit, die Shell-Erweiterung zu nutzen, um Werte in eine Zeichenfolge zu ersetzen, die Verwendung von eval
in irgendeiner Form. Dies ist sicher, solange Sie den Wert von str1
kontrollieren und kann sicherstellen, dass nur Variablen referenziert werden, die als sicher bekannt sind (keine vertraulichen Daten enthalten) und keine anderen Shell-Sonderzeichen ohne Anführungszeichen enthalten. Sie sollten den String in doppelte Anführungszeichen oder in ein Here-Dokument erweitern, also nur "$`
sind etwas Besonderes (ihnen muss ein vorangestellt werden in
str1
).
eval "substituted="$str1""
Es wäre viel robuster, eine Funktion anstelle eines Strings zu definieren.
fill_template () {
sentence1="I went to ${PLACE} and saw ${EVENT}"
sentence2="If you do ${ACTION} you will ${RESULT}"
}
Setzen Sie die Variablen und rufen Sie dann die Funktion fill_template
auf um die Ausgangsvariablen zu setzen.
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"."