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]}"