Saltar al contenido

zsh: ¿Cómo obtener el valor de la variable en función de otra variable?

Alonzo, miembro de nuestro equipo, nos ha hecho el favor de redactar este artículo porque conoce perfectamente el tema.

Solución:

Con zsh:

  • $(P)varname se expande al valor de la variable cuyo nombre está almacenado en $varname. Así que si $varname contiene var, $(P)varname se expande a lo mismo que $var.
  • $(e)var se expande al contenido de $var pero también realiza expansiones de parámetros, sustitución de comandos y expansión aritmética dentro. Así que si $var contiene $othervar, $(e)var se expande a lo mismo que $othervar.
  • Puede anidar operadores de expansión variable, por lo que cosas como $(P)$var:-something trabajar
  • $:-content es una forma de hacer que una expansión de parámetros se expanda a texto arbitrario (aquí content)

(ver el manual para más detalles)

Así que podrías hacer:

_v1=windows
_v2_windows=/mnt/d
printf '%sn' $(P)$:-_v2_$_v1

O:

printf '%sn' $(e)$:-$_v2_$_v1

O hazlo en dos pasos:

varname=_v2_$_v1
printf '%sn' $(P)varname

O:

expansions_to_evaluate=$_v2_$_v1

printf '%sn' $(e)expansions_to_evaluate

O podría usar la sintaxis estándar de POSIX:

eval 'printf "%sn" "$_v2_'"$_v1"'"'

Tenga en cuenta que si el valor de $_v1 no está bajo su control, todo eso equivale a una vulnerabilidad de inyección de comando arbitraria, primero debe desinfectar el valor.

También tenga en cuenta que zsh admite arreglos asociativos (y mucho antes bash), por lo que puedes hacer:

typeset -A mnt
mnt=(
  windows /mnt/d
  osx     /Volumes/d
)
os=windows
printf '%sn' $mnt[$os]

Lo cual sería mucho más legible y no tendría ninguna de esas implicaciones de seguridad.

printf '%sn' "$(P)$(echo "_v2_$_v1")"

alternativamente

var=_v2_$_v1
printf '%sn' "$(P)var"

En ambos casos, la bandera de expansión de parámetros (P) se usa para expandir el nombre dentro $... en el nombre de la variable real de la que nos gustaría obtener el valor.

Esto es similar a indirección variable con $!... en el bash caparazón.

Si estás contento con lo expuesto, eres capaz de dejar una reseña acerca de qué le añadirías a esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.