私は次のスクリプトを書いた
ロード機能は配列disk[a]=1
などを設定する必要があります。disk[b]=2
その後、out関数は配列を印刷する必要があります${disk[a]}
。${disk[b]}
しかし、関数出力から取得するのは常に数値です。4
代わりに、次のようにしたいと思います。
1
2
3
4
ここで何の問題がありますか?
関数出力を印刷するように変更するには:
1
2
3
4
スクリプト:
#!/bin/bash
function load
{
counter=1
for input in a b c d
do
disk[$input]=$counter
let counter=$counter+1
echo ${disk[$input]}
done
}
function out
{
counter=1
for input in a b c d
do
echo ${disk[$input]}
let counter=$counter+1
done
}
echo "run function load"
load
echo "run function out"
out
出力:
./test
run function load
1
2
3
4
run function out
4
4
4
4
答え1
配列を初期化すると、何が起こるかを確認してください。
$ i=0; for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -a A=([0]="3")
要素が1つだけ存在し、そのインデックスは0です。
デフォルトでは、配列は索引付けされます。数字で、使用するインデックス値はすべて0です。実際には、算術コンテキストでは、通常の配列添字と同様に、文字列が変数名として扱われ、その変数の値が使用されます。したがってa
、...を数値に設定すると、b
他の結果が表示されます。
$ a=123; b=456; c=789; d=999; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done;
$ declare -p A
declare -a A=([123]="0" [456]="1" [789]="2" [999]="3")
declare -A arrayname
実際に文字列自体をインデックスとして使用するには、最初または次を使用して配列を連想配列として宣言しますtypeset -A arrayname
。
$ unset A; declare -A A; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -A A=([a]="0" [b]="1" [c]="2" [d]="3" )
答え2
Bash配列はインデックス配列基本的に:
構文を使用して変数を割り当てると、インデックス配列が自動的に生成されます。
name[subscript]=value
...しかし、文字をインデックスとして使用しているので、連想配列が必要な場合があります。つまり、次のものが必要です。
declare -A disk
関数を呼び出す前に。