私はそれが比較的簡単であると確信しています、私はそれを行う方法を知らないだけです。
#!/usr/bin/ksh
set `iostat`
myvar=6
私echo ${$myvar}
は${$myvar}
-> ${6}
->と解釈したいようなものにしたいvalue
私はそれが比較的簡単であると確信しています、私はそれを行う方法を知らないだけです。
#!/usr/bin/ksh
set `iostat`
myvar=6
私echo ${$myvar}
は${$myvar}
-> ${6}
->と解釈したいようなものにしたいvalue
回答:
これを行うにはeval
、kshを含む多くの優れたシェルに組み込まれています。
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
トリックはeval
、$ myvarが「6」で置換されるように、フィードする文字列を二重引用符で囲み、外側のドル記号をバックスラッシュしeval
て、文字列「$ 6」を取得することです。
出力に「%user」を取得しましたが、マルチプロセッサRHELマシンで試しました。
vv=$( eval "echo \$$vn" )
最近の高度なシェルには、名前が別の変数に保存されている変数の値を参照する方法があります。残念ながら、この方法はksh、bash、zshで異なります。
mksh≥R39bではmyvar
、nameref を作成できます。
typeset -n myvar=6
echo "$myvar"
これは、位置パラメータへの名前参照をサポートしていないため、ATT ksh93では機能しません。変数名を含む変数がある場合、このメソッドを使用できます。
foo=bar
typeset -n myvar=foo
echo "$myvar" # prints bar
bash≥2.0では、次のように記述できます
echo "${!myvar}"
zshでは、次のように書くことができます
echo ${(P)myvar}
ksh88やpdkshを含む古いシェルでは、ブルース・エディガーが説明したように、別の変数名を含む変数がありeval
、この変数の値を使用したい場合にのみ頼りにします。このソリューションは、Bourne / POSIXシェルで機能します。
eval "value=\${$myvar}"
echo "$value"
これがここでの最良の方法です。より簡単で移植性があります。
ユースケースでは、配列(すべてのkshバリアント、bash≥2.0、zsh)を使用するシェルで、配列変数に割り当てて、希望する要素を取得できます。kshおよびbash配列は0から番号付けを開始しますが、setopt ksh_arrays
またはを発行しない限り、zshは1から開始することに注意してくださいemulate ksh
。
set -A iostat -- $(iostat)
echo "${iostat[5]}"
位置パラメータを配列変数にコピーする場合a
:
set -A a -- "$@"
ksh93、mksh≥R39b、bash≥2.0、およびzshでは、配列割り当て構文を使用できます。
iostat=($(iostat))
echo "${iostat[5]}"
eval "vv=\${$vn}"
。メルシー・ボークー、親切な先生。
Gilles(bash
答えの一部を提供した)が示したように、ブルース・エディガーの(移植性eval
のある方法で)を無効にしないでnameref
、最近mksh
(およびAT&T ksh93で-@Gillesがコメントしたように-namerefsを除いて) AT&T kshの定位置パラメーターを参照することはできません。名前付きパラメーターのみを参照してください)。
#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar
抵抗を改善するために--
afterも追加しましたset
。
typeset: 6: invalid variable name
)を参照できません。
しばらくの間、kshまたはそのバリアントを使用していないため、ksh(またはbash)に同様の機能があるかどうかはわかりません。私の主なシェルはzshです。iostatなどのコマンドからの出力を処理するときは、複数の行を生成し、すべての行が同じ形式/長さではないため、配列を使用します。
#! /bin/zsh
IOStatOutput=("${(@f)$(iostat)}") # Produces one element per line
上記も位置パラメータの使用をバイパスします。ここで、たとえばデバイスの配列を生成する場合:
for Element in {7..${#IOStatOutput}} # Devices listed in elements 7 thru the last
do
DevList+=( ${${=IOStatOutput[Element]}[1]} )
done
小さいチャンクの方がはるかに扱いやすいと思います。コードに応じて、間接変数参照を使用する必要がある場合としない場合があります。それがどのように機能するかを知ることは、まだ良いことです。自分で使います。