Quería inicializar algunas cadenas en la parte superior de mi secuencia de comandos con variables que aún no se han configurado, como:
str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'
y luego en PLACE
, EVENT
, ACTION
y RESULT
se establecerá. Quiero poder imprimir mis cadenas con las variables expandidas. Es mi única opción eval
? Esto parece funcionar:
eval "echo ${str1}"
¿Esto es estándar? ¿Hay una mejor manera de hacer esto? Sería bueno no ejecutar eval
teniendo en cuenta las variables podría ser cualquier cosa.
Respuesta aceptada:
Con el tipo de entrada que muestra, la única forma de aprovechar la expansión de Shell para sustituir valores en una cadena es usar eval
de alguna forma. Esto es seguro siempre que controle el valor de str1
y puede asegurarse de que solo hace referencia a variables que se conocen como seguras (que no contienen datos confidenciales) y no contiene ningún otro carácter especial de shell sin comillas. Debe expandir la cadena dentro de comillas dobles o en un documento aquí, de esa manera solo "$`
son especiales (deben ir precedidos de un en
str1
).
eval "substituted="$str1""
Sería mucho más robusto definir una función en lugar de una cadena.
fill_template () {
sentence1="I went to ${PLACE} and saw ${EVENT}"
sentence2="If you do ${ACTION} you will ${RESULT}"
}
Establezca las variables y luego llame a la función fill_template
para configurar las variables de salida.
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"."