Estoy seguro de que es relativamente simple, simplemente no sé cómo hacerlo.
#!/usr/bin/ksh
set `iostat`
myvar=6
Quiero algo como lo echo ${$myvar}
que quiero interpretar como ${$myvar}
-> ${6}
->value
shell-script
ksh
variable-substitution
Brandon Kreisel
fuente
fuente
Respuestas:
Puede hacer esto con
eval
, incorporado en muchos shells finos, incluido ksh:El truco consiste en comillas dobles la cadena a la que se alimenta para
eval
que $ myvar se sustituya con "6", y barra diagonal inversa el signo de dólar exterior, de modo que seeval
obtenga una cadena "$ 6".Obtuve "% user" para la salida, pero lo probé en una máquina RHEL multiprocesador.
fuente
vv=$( eval "echo \$$vn" )
. ¡Gracias una tonelada!Referencia de variable indirecta
Los shells avanzados modernos tienen un método para hacer referencia al valor de una variable cuyo nombre se almacena en otra variable. Lamentablemente, el método difiere entre ksh, bash y zsh.
En mksh ≥R39b, puede hacer
myvar
un nameref:Esto no funciona en ATT ksh93 porque no admite namerefs a parámetros posicionales. En el caso de que tenga una variable que contenga un nombre de variable, puede usar este método.
En bash ≥2.0, puedes escribir
En zsh, puedes escribir
En shells más antiguos, incluidos ksh88 y pdksh, su único recurso cuando tiene una variable que contiene otro nombre de variable y desea utilizar el valor de esta variable
eval
, como explica Bruce Ediger . Esta solución funciona en cualquier shell Bourne / POSIX.Usando una matriz
Este es el mejor método aquí: es más simple y más portátil.
Para su caso de uso, en cualquier shell con matrices (todas las variantes ksh, bash ≥2.0, zsh), puede asignar a una variable de matriz y tomar el elemento que desee. Tenga en cuenta que las matrices ksh y bash comienzan a numerarse en 0, pero zsh comienza en 1 a menos que emita
setopt ksh_arrays
oemulate ksh
.Si desea copiar los parámetros posicionales a una variable de matriz
a
:En ksh93, mksh ≥R39b, bash ≥2.0 y zsh, puede usar la sintaxis de asignación de matriz:
fuente
eval "vv=\${$vn}"
. Merci beaucoup, amable señor.Como lo indicó Gilles (quien proporcionó la
bash
parte de la respuesta), además de no invalidar la de Bruce Ediger (sobre cómo hacerlo de manera portátileval
), a continuación se explica cómo hacerlo connameref
recientemksh
(y AT&T ksh93, excepto - como comentó @Gilles - namerefs no puede referirse a parámetros posicionales en AT&T ksh, solo a parámetros nombrados):También se agregó el
--
afterset
para mejorar la resistencia.fuente
typeset: 6: invalid variable name
).Otro uso de matrices
No he usado ksh ni ninguna variante durante algún tiempo, por lo que no estoy seguro de si ksh (o bash) tiene una capacidad similar. Mi caparazón principal es zsh. Utilizo matrices cuando manejo la salida de comandos como iostat porque producen múltiples líneas, y no todas las líneas tienen el mismo formato / longitud.
Lo anterior también omite el uso de parámetros posicionales. Ahora, si desea generar, digamos, una matriz de dispositivos:
Encuentro trozos más pequeños mucho más fáciles de manejar. Puede que necesite o no usar una referencia de variable indirecta, dependiendo de su código. Saber cómo funciona sigue siendo bueno saberlo. Lo uso yo mismo.
fuente