関数内で宣言された Bash 配列は関数外では利用できません

関数内で宣言された Bash 配列は関数外では利用できません

bash (v4.3.11) ターミナルで次のように入力します:

function FUNCtst() { declare -A astr; astr=([a]="1k" [b]="2k" ); declare -p astr; };FUNCtst;declare -p astr

(以下、読みやすくするために同じことを書きます)

function FUNCtst() { 
  declare -A astr; 
  astr=([a]="1k" [b]="2k" ); 
  declare -p astr; 
};
FUNCtst;
declare -p astr

これを出力します (関数外では配列の値が失われますが、なぜでしょうか?)

declare -A astr='([a]="1k" [b]="2k" )'
bash: declare: astr: not found

次のように出力されると予想していました:

declare -A astr='([a]="1k" [b]="2k" )'
declare -A astr='([a]="1k" [b]="2k" )'

どうすれば機能するのでしょうか?

答え1

からマニュアルページ:

関数内で使用する場合、オプションが使用されlocalない限り、declare はコマンドと同様に各名前をローカルにします-g

例:

FUNCtst() { 
    declare -gA astr
    astr=([a]="1k" [b]="2k" )
    declare -p astr
}
FUNCtst
declare -p astr

プリント

declare -A astr=([a]="1k" [b]="2k" )
declare -A astr=([a]="1k" [b]="2k" )

関連情報