Bashでこれら2つの連想配列宣言の違いは何ですか?

Bashでこれら2つの連想配列宣言の違いは何ですか?

私はBashで連想配列を使って遊んでおり、まったく同じ宣言を持つ連想配列を使用するときと使用しないときに次の違いを見つけましたdeclare。コードは以下のように表示されます。

#!/usr/bin/env bash

echo -e "\n\nASSOCIATIVE ARRAY\n"
declare -A MY_MAP=( 
    [Madrid]="Spanish" 
    [London]="English" 
    [Paris]="French" 
    [1]=2
    [3]=3.14 
)
echo "First element: $MY_MAP"
echo "Whole content as single string: ${MY_MAP[*]}"
echo "Whole content quoted separately: ${MY_MAP[@]}"
echo "List of indices: ${!MY_MAP[@]}"
echo "Array length: ${#MY_MAP[*]}"
echo "Array length: ${#MY_MAP[@]}"
echo "Second element: ${MY_MAP[London]}"
echo "Last 2 elements: ${MY_MAP[@]:1:3}"

echo -e "\n\nASSOCIATIVE ARRAY - 2\n"
MY_MAP2=( 
    [Madrid]="Spanish" 
    [London]="English" 
    [Paris]="French" 
    [1]=2
    [3]=3.14 
)
echo "First element: $MY_MAP2"
echo "Whole content as single string: ${MY_MAP2[*]}"
echo "Whole content quoted separately: ${MY_MAP2[@]}"
echo "List of indices: ${!MY_MAP2[@]}"
echo "Array length: ${#MY_MAP2[*]}"
echo "Array length: ${#MY_MAP2[@]}"
echo "Second element: ${MY_MAP2[London]}"
echo "Last 2 elements: ${MY_MAP2[@]:1:3}"

前のスクリプトを実行すると、次の結果が表示されます。

ASSOCIATIVE ARRAY

First element: 
Whole content as single string: French 3.14 2 English Spanish
Whole content quoted separately: French 3.14 2 English Spanish
List of indices: Paris 3 1 London Madrid
Array length: 5
Array length: 5
Second element: English
Last 2 elements: French 3.14 2


ASSOCIATIVE ARRAY - 2

First element: French
Whole content as single string: French 2 3.14
Whole content quoted separately: French 2 3.14
List of indices: 0 1 3
Array length: 3
Array length: 3
Second element: French
Last 2 elements: 2 3.14

私の質問は、declare -A出力を異なるようにするにはどうすればよいですか?

ここで何が起こっているのかを詳しく知っていただければ幸いです。

よろしくお願いします。

ベストアンサー1

declare -A最初の宣言が連想配列とみなされる唯一の理由です。 2番目の宣言はインデックス配列として扱われます。インデックス配列で作業するとき、インデックスは算術コンテキストとして扱われMadridます。したがって、割り当ては、、、、およびyesで読み取られます。LondonParis[0]="Spanish"[0]="English"[0]="French"[1]=2[3]=3.14${MY_MAP2[London]}${MY_MAP2[0]}

おすすめ記事