/ / Script de shell de Linux: permite al usuario usar variables en la entrada - linux, bash, shell, terminal

Script de shell Linux: Permitir al usuario usar variables en la entrada - linux, bash, shell, terminal

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

test.sh:

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

salida:

Enter input: $test
$test

Quiero poder ingresar "$ test" durante el segmento de petición (leer -p) 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 voy a hacer eso?



ACTUALIZAR:

Usando las respuestas que se me proporcionaron aquí y en este hilo (¡Muchísimas gracias a los colaboradores y comentaristas!), pude juntar esta línea que funcionó muy bien para mí:

newvariable="$(eval echo $input)"

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

Respuestas

1 para la respuesta № 1

Hay algunas respuestas diferentes a esta pregunta.

Si en realidad estás usando bash, mira el bash(1) página de hombre y leer el Expansión de parámetros sección:

Si el primer carácter del parámetro es un signo de exclamación (!), introduce un nivel de indirección variable. Bash usa el valor de la variable formada a partir del resto del parámetro como El nombre de la variable; esta variable luego se expande y ese valor se usa en el resto de la sustitución, en lugar de el valor del parámetro en sí mismo Esto se conoce como indirecto expansión. Las excepciones a esto son las expansiones de ${!prefix*} y ${!name[@]} descrito abajo. La exclamación punto debe seguir inmediatamente la llave a la izquierda para introducir indirección

Esto significa que si tienes:

read $input
echo "${!input}"

Y el usuario entra "HOME", verás el valor de $HOME. por ejemplo, en mi sistema:

Enter input: HOME
/home/lars

Alternativamente, puedes usar el eval comando, que debería funcionar bien en cualquier entorno tipo Bourne-shell:

eval [arg ...]

Los args son leídos y concatenados juntos enun solo comando. Este comando luego es leído y ejecutado por el shell, y su salida el estado se devuelve como el valor de eval. Si no hay argumentos, o solo argumentos nulos, eval devuelve 0.

Tu código puede verse así:

read $input
eval echo "$$input"

El shell primero expandirá el valor de $input, de manera que la línea de comando resultante - suponiendo que alguien entra HOME en respuesta al aviso - es:

eval echo $HOME

los $ simplemente está escapando de la $ con el para que el caparazón no lo interpreta como el comienzo de una variable durante el primer pasar a través de la línea de comando.

Pero hay un problema aquí, considera:

Enter input: ;date
$
Sun Feb 14 21:13:33 EST 2016

En este ejemplo, el punto y coma hizo que el shell ejecutara un comando, que no es necesariamente lo que esperábamos o deseamos. Usted puede mitigar esto un tanto con mejores citas:

eval echo ""$input""

Que en el ejemplo anterior resulta en:

$ sh foo.sh
Enter input: ;date
$;date

Pero la lección aquí es "no usar" eval en seguridad sensible situaciones ".