このコードを実行すると、「無効な置換」エラーが発生します。ループを使ってh_1
、h_2
の値を印刷したいと思います。h_3
for
#/!/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))
式は二重引用符で囲まれたように処理されますが、括弧内の二重引用符は特に処理されません。式のすべてのトークンは、パラメータ拡張、文字列拡張、コマンド置換、および引用符の削除を受けます。算術拡張は入れ子にすることができます。