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 № 1Hay 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 ".