数字を含む BASH 変数名の問題

数字を含む BASH 変数名の問題

数値を含む変数を使用すると問題が発生します。

これは機能します。

sourceid_2="blah"
echo $sourceid_2

しかし、これは機能しません。

sourceid_2="blah"
i=2
echo $sourceid_$i

これを修正する方法はありますか? アンダースコアなしで試してみましたが、効果はありませんでした。

私の最終目標は、for i in {2..7} ループ内の変数を使用して次の操作を実行することです。

for i in {2..7}
do
echo $sourceid_$i
done

答え1

echo $sourceid_$iは 2 つの別々の変数を展開します:$sourceid_および$i。 実行しようとしていることを実行する最も簡単な方法は、間接参照を使用することです:

sourceid_2="blah"
i=2
var=sourceid_$i
echo "${!var}"

しかし、@dave_thompson_085 が指摘したように、このようなことを実行するには、通常、配列を使用する方が適しています。

declare -a sourceid
sourceid[2]="blah"
i=2
echo "${sourceid[i]}"

配列は bash 拡張機能であり、より基本的なシェルでは使用できないことに注意してください。

答え2

問題は、問題なく動作する数字を含む名前ではなく、変数eval(正しく実行するのは難しく、失敗しやすい)または間接的な表現を使うことができます。x=source_$i; echo "${!x}"この場合、これは名前に変数を含むbash配列SX はすでに関連リストに自動的に追加してあるので、参照できます。

しかし、関連する複数の変数に番号でアクセスしたい場合は、配列を使用する方がよいでしょう。配列はまさにそのように設計されており、より便利で安全です。bashの配列について学ぶには、システムまたはウェブはこちら

関連情報