Bashで文字列配列を使用する方法

Bashで文字列配列を使用する方法

私は次のスクリプトを書いた

ロード機能は配列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

関数を呼び出す前に。

関連情報