
このスクリプトにはどのような問題がありますか? 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)'
.let
declare
コマンドを実行しないという点で同様です。ただし、算術演算には逆の方法を使用することdeclare
もできます。let
let a="1 + 2"
a=3
.
答え2
bash FAQではアイテム間接について。ほとんどのユースケースで実際にやるべきことは、関連配列またはインデックス配列を使用することです。また、使用することができます
func_call_by_reference() { # Bash 4.3
typeset -n ref=$1 # nameref to the variable named by the caller
ref=( "val1" "val2" ... ) # return an array by reference
}
複雑な参照を避けながらこれを行うための追加オプションについては、よくある質問をご覧くださいeval
。
答え3
次のコードを使用できます。コードでは、シェルは"$x"1=1
有効な変数割り当てではないため、コマンドとして実行されます。
LIST="A B C"
for x in $LIST
do
a=$(echo "$x"1)
let $a=1
done