他の変数「内部」で変数参照を使用する

他の変数「内部」で変数参照を使用する

私はこれが比較的簡単であると確信しています。どうすればいいのかわかりません。

#!/usr/bin/ksh
set `iostat`
myvar=6

私はこれが欲しいです。私はそれを -> ->echo ${$myvar}として解釈したい。${$myvar}${6}value

答え1

evalkshを含む多くの良いシェルに組み込まれているシェルを使用してこれを行うことができます。

#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"

$ myvarが「6」に置き換えられるように入力した文字列を二重引用符で囲み、文字列「$ 6」を取得するevalように外側のドル記号をバックスラッシュすることがコツです。eval

"%user"という出力を得ましたが、マルチプロセッサRHELシステムで試しました。

答え2

間接変数参照

最新の高度なシェルには、名前が異なる変数に格納されている変数の値を参照する方法があります。残念ながら、メソッドはksh、bash、zshによって異なります。

myvarmksh≥R39bでは、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から始まりますが、zshはsetopt ksh_arraysまたは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]}"

答え3

Gilles(bash答えの一部を提供した人)が指摘したように、これはBruce Ediger(ポータブルタスクに使用する方法)を無効にしません。これはeval最近使用された方法です(そして@ Gillesが述べたようにAT&T ksh93を除く)。 - namerefs)は参照できません。 AT&T kshの位置パラメーターは、指定されたパラメーターのみを参照できます。namerefmksh

#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar

また、抵抗を改善するために追加--されましたset

答え4

アレイの別の用途

しばらくは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

小さな塊が作業しやすくなることがわかりました。コードによっては、間接変数参照を使用する必要がある場合もあれば必要ではない場合もあります。それがどのように機能するかを知ることはまだ良いです。私はそれを直接使用します。

関連情報