Script de shell de Linux: permite al usuario proporcionar nombres de variables en el mensaje de entrada

Script de shell de Linux: permite al usuario proporcionar nombres de variables en el mensaje de entrada

Estoy escribiendo un script de shell para terminal Linux. Quiero poder ingresar nombres de variables en un mensaje. Por ejemplo:

prueba.sh:

 test="Monkey in the middle..."
 read -p "Enter input: " input
 echo $input

producción:

 Enter input: $test
 $test

Quiero poder ingresar "$test" durante el read -psegmento de solicitud del script y hacer que el script repita "Mono en el medio..." al final en lugar de repetir "$test" como lo hace ahora.

¿Cómo haría para hacer eso?



ACTUALIZAR:

Usando las respuestas que me proporcionaron aquí y eneste hilo(¡muchas gracias a los contribuyentes y comentaristas!), logré reconstruir esta línea que funcionó muy bien para mí:

newvariable="$(eval echo $input)" 

Tenga en cuenta que me advirtieron más de una vez que el uso de eval puede representar un riesgo para la seguridad. Tenga esto en cuenta si opta por esta solución.

Respuesta1

En lugar de

echo "$input"

intentar

eval echo "$input"

Ni siquiera es específico de bash, ¡funciona en /bin/sh!

Tenga en cuenta que esto plantea un grave riesgo de seguridad porque evalsimplemente ejecuta lo que le da. En este caso, el shell interpreta la cadena $inputcomo $testy luego evalla ejecuta echo $test. ¿Pero qué pasa si el usuario ingresa $test; rm -rf *? evalse presentaría con echo $test; rm -rf *. Ten mucho cuidado si haces esto.

Respuesta2

En bash puedes usar unexpansión de parámetros indirectossintaxis:

test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}

En este caso, el usuario solo debe proporcionar testuna cadena sin el signo de dólar anterior.

Respuesta3

Siempre que no le importe que el usuario pueda ejecutar comandos arbitrarios al incluir una sustitución de comando $(…), puede enviar la cadena al evalarchivo incorporado. Tenga en cuenta que evalespera un fragmento de shell y, si la entrada incluye comillas, pueden provocar errores de sintaxis. La forma (relativamente) fácil de lidiar con las cotizaciones es utilizar un documento aquí para realizar las sustituciones. Todavía estás a merced de una variable no terminada o de una sustitución de comando (p. ej $(foo.).

IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}

información relacionada