Tiene razón, eval
es un riesgo de seguridad en este caso. Este es un enfoque posible:
pattern='The $a is $b when the $z is $x $c $g.' # simulated input from user (use "read")
unset results
for word in $pattern
do
case $word in
\$a)
results+=($(some_command)) # add output of some_command to array (output is "werewolf"
;;
\$b)
results+=($(echo "active"))
;;
\$c)
results+=($(echo "and"))
;;
\$g)
results+=($(echo "the sky is clear"))
;;
\$x)
results+=($(echo "full"))
;;
\$z)
results+=($(echo "moon"))
;;
*)
do_something # count the non-vars, do a no-op, twiddle thumbs
# perhaps even sanitize %placeholders, terminal control characters, other unwanted stuff that the user might try to slip in
;;
esac
done
pattern=${pattern//\$[abcgxz]/%s} # replace the vars with printf string placeholders
printf "$pattern\n" "${results[@]}" # output the values of the vars using the pattern
printf -v sentence "$pattern\n" "${results[@]}" # put it into a variable called "sentence" instead of actually printing it
la salida sería "El hombre lobo está activo cuando la luna está llena y el cielo está despejado." El mismo programa, si el patrón es 'The $ x $ z out $ c $ g, entonces $ a debe ser $ b.' entonces la salida sería "La luna llena está afuera y el cielo está despejado, por lo que el hombre lobo debe estar activo".
tengo curiosidad por qué quiere hacer esto o lo que en realidad estás tratando de lograr. Algunas veces, 'eval' es el correcto o el único camino a seguir, pero también hay características especiales de' declare' y 'printf' que pueden ser útiles. Y puede haber otras formas de lograr lo que busca. –
Tengo un script bash que quiero que sea configurable. Quiero que el usuario tenga la capacidad de especificar un "patrón". Más tarde, algunas variables en el patrón serán reemplazadas por actividades ejecutadas por el script (consultas SQL, llamadas SOAP y otras utilidades internas) y pasadas a otro programa de línea de comandos. Soy algo nuevo para Bash y algo acerca de este enfoque simplemente se siente mal. Gracias por preguntar más detalles. – User1