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
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
Respuestas:
Puede hacer esto con eval
, incorporado en muchos shells finos, incluido ksh:
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
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 se eval
obtenga una cadena "$ 6".
Obtuve "% user" para la salida, pero lo probé en una máquina RHEL multiprocesador.
vv=$( eval "echo \$$vn" )
. ¡Gracias una tonelada!
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:
typeset -n myvar=6
echo "$myvar"
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.
foo=bar
typeset -n myvar=foo
echo "$myvar" # prints bar
En bash ≥2.0, puedes escribir
echo "${!myvar}"
En zsh, puedes escribir
echo ${(P)myvar}
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.
eval "value=\${$myvar}"
echo "$value"
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
o emulate ksh
.
set -A iostat -- $(iostat)
echo "${iostat[5]}"
Si desea copiar los parámetros posicionales a una variable de matriz a
:
set -A a -- "$@"
En ksh93, mksh ≥R39b, bash ≥2.0 y zsh, puede usar la sintaxis de asignación de matriz:
iostat=($(iostat))
echo "${iostat[5]}"
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átil eval
), a continuación se explica cómo hacerlo con nameref
reciente mksh
(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):
#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar
También se agregó el --
after set
para mejorar la resistencia.
typeset: 6: invalid variable name
).
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.
#! /bin/zsh
IOStatOutput=("${(@f)$(iostat)}") # Produces one element per line
Lo anterior también omite el uso de parámetros posicionales. Ahora, si desea generar, digamos, una matriz de dispositivos:
for Element in {7..${#IOStatOutput}} # Devices listed in elements 7 thru the last
do
DevList+=( ${${=IOStatOutput[Element]}[1]} )
done
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.