異なる変数内の変数に値を渡す方法

異なる変数内の変数に値を渡す方法

このコードを実行すると、「無効な置換」エラーが発生します。ループを使ってh_1h_2の値を印刷したいと思います。h_3for

#/!/bin/bash
h_1=12
h_2=13
h_3=14
for ((i=1; i<=2; i++))
 do
  echo "${h_$i}"
done

答え1

使用する必要があります間接パラメータの拡張そして!

tmp=h_$i
echo "${!tmp}

ここに追加の変数を作成する必要がありますtmp。残念ながら、文字列だけを使用することはできません。間接拡張は次のように機能します。

パラメーターの最初の文字が感嘆符(!)の場合、1段階変数間接指定が導入されます。 Bash は、残りの引数で構成される変数値を変数名として使用します。次に、その変数を展開し、引数自体の値ではなく、残りの置換にその値を使用します。これを間接拡張といいます。

したがって、上記の内容は、${!tmp}名前が次の変数の値に拡張されます。変数tmp

また利用できますevalここでは間接的なアプローチがよりきれいです。

答え2

私は二重括弧形式を使用します。Arithmetic Expansion:

echo $((h_$i))

配列、一時変数、その他の素晴らしいものは必要ありません。また、私はこの形式が最も移植性があると思います(私が知る限り、POSIXには算術拡張が必要です)。

Bashのマニュアルから:

算術拡張を使用すると、算術式を評価して結果を変更できます。算術拡張の形式は次のとおりです。

          $((expression))

式は二重引用符で囲まれたように処理されますが、括弧内の二重引用符は特に処理されません。式のすべてのトークンは、パラメータ拡張、文字列拡張、コマンド置換、および引用符の削除を受けます。算術拡張は入れ子にすることができます。

関連情報