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 -p
segmento 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 eval
simplemente ejecuta lo que le da. En este caso, el shell interpreta la cadena $input
como $test
y luego eval
la ejecuta echo $test
. ¿Pero qué pasa si el usuario ingresa $test; rm -rf *
? eval
se 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 test
una 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 eval
archivo incorporado. Tenga en cuenta que eval
espera 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#_}