変数名による変数の定義

変数名による変数の定義

このスクリプトにはどのような問題がありますか? A1 = 1、B1 = 1、C1 = 1を定義しようとしています。

LIST="A B C"
for x in $LIST
do
    "$x"1=1
done

結果:

./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found

ベストアンサー1

変数割り当て形式は、変数名、等号、および(オプション)値です。

これは有効な割り当てです:

ABC=123

"$x"1=1"$x"1変数名ではないため、有効な割り当てではありません。おそらく評価する変数名に似ていますが、実際にはそうではありません。実際、シェルはそれがコマンドだと思います。

達成しようとする目標を達成する1つの方法は次のとおりです。

eval "$x"1=1

Bashの別の方法は次のとおりです(他のシェルではありません)。

declare "$x"1=1

または(再びbashのみ):

let "$x"1=1

(あなたの状況もあまり変わりません。)

しかし、次のようにザクゼで指摘したコメント、シェルに配列(ksh、bash、またはzsh)がある場合は、配列を使用できます。


完全性のために:

  • eval任意のコマンドを実行します。したがって、等号の右側にコマンドに展開される変数がある場合は、そのコマンドが実行されます。以下のコード:

    x=a
    y='$(echo hello)'
    eval "$x=$y"
    

    a=hello.

  • declare変数を割り当ててコマンドを実行しない bash 組み込みコマンドです。以下のコード:

    x=a
    y='$(echo hello)'
    declare "$x=$y"
    

    a='$(echo hello)'.

  • letdeclareコマンドを実行しないという点で同様です。ただし、算術演算には逆の方法を使用することdeclareもできます。let

    let a="1 + 2"
    

    a=3.

おすすめ記事