Volevo inizializzare alcune stringhe nella parte superiore del mio script con variabili che non sono state ancora impostate, come ad esempio:
str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'
e poi su PLACE
, EVENT
, ACTION
e RESULT
sarà impostato. Voglio quindi essere in grado di stampare le mie stringhe con le variabili espanse. La mia unica opzione è eval
? Questo sembra funzionare:
eval "echo ${str1}"
è questo standard? c'è un modo migliore per farlo? Sarebbe bello non eseguire eval
considerando le variabili potrebbe essere qualsiasi cosa.
Risposta accettata:
Con il tipo di input che mostri, l'unico modo per sfruttare l'espansione della shell per sostituire i valori in una stringa è usare eval
in qualche forma. Questo è sicuro finché controlli il valore di str1
e può garantire che faccia riferimento solo a variabili note come sicure (che non contengono dati riservati) e non contenga nessun altro carattere speciale della shell senza virgolette. Dovresti espandere la stringa tra virgolette doppie o in un documento here, in questo modo solo "$`
sono speciali (devono essere preceduti da un in
str1
).
eval "substituted="$str1""
Sarebbe molto più robusto definire una funzione invece di una stringa.
fill_template () {
sentence1="I went to ${PLACE} and saw ${EVENT}"
sentence2="If you do ${ACTION} you will ${RESULT}"
}
Imposta le variabili, quindi chiama la funzione fill_template
per impostare le variabili di output.
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"."