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