Use a variable reference "inside" another variable
You can do this with eval
, built-in to many fine shells, including ksh:
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
The trick is to double-quote the string you feed to eval
so that $myvar gets substituted with "6", and to backslash the outer dollar-sign, so that eval
gets a string "$6".
I got "%user" for the output, but I tried it on a multi-processor RHEL machine.
Indirect variable reference
Modern advanced shells have a method to reference the value of a variable whose name is stored in another variable. Unfortunately the method differs between ksh, bash and zsh.
In mksh ≥R39b, you can make myvar
a nameref:
typeset -n myvar=6
echo "$myvar"
This doesn't work in ATT ksh93 because it doesn't support namerefs to positional parameters. In the case where you have a variable containing a variable name, you can use this method.
foo=bar
typeset -n myvar=foo
echo "$myvar" # prints bar
In bash ≥2.0, you can write
echo "${!myvar}"
In zsh, you can write
echo ${(P)myvar}
In older shells, including ksh88 and pdksh, your only recourse when you have a variable containing another variable name and want to use the value of this variable eval
, as explained by Bruce Ediger. This solution works in any Bourne/POSIX shell.
eval "value=\${$myvar}"
echo "$value"
Using an array
This is the best method here: it's simpler and more portable.
For your use case, in any shell with arrays (all ksh variants, bash ≥2.0, zsh), you can assign to an array variable and take the element you wish. Beware that ksh and bash arrays start numbering at 0, but zsh starts at 1 unless you issue setopt ksh_arrays
or emulate ksh
.
set -A iostat -- $(iostat)
echo "${iostat[5]}"
If you want to copy the positional parameters to an array variable a
:
set -A a -- "$@"
In ksh93, mksh ≥R39b, bash ≥2.0 and zsh, you can use the array assignment syntax:
iostat=($(iostat))
echo "${iostat[5]}"