Bash объявлять ассоциативный массив через функцию дает неассоциативный массив - PullRequest
0 голосов
/ 30 января 2020

Я попытался объявить ассоциативный массив через функцию, и я обнаружил, что ассоциативный массив становится простым массивом. Тестовый код выглядит следующим образом:

bash-5.0$ cat test.sh
#!/bin/bash

createArr(){ declare -A "$1"; }

# create array using `createArr'
name=array1
createArr $name
array1[1]=1
echo "${!array1[@]}"
array1[a]=1
echo "${!array1[@]}"
declare -p array1

# create array directly
name=array2
declare -A $name
array2[1]=1
echo "${!array2[@]}"
array2[a]=1
echo "${!array2[@]}"
declare -p array2

И выполнение кода дает следующий результат:

bash-5.0$ ./test.sh
1
0 1
declare -a array1=([0]="1" [1]="1")
1
1 a
declare -A array2=([1]="1" [a]="1" )

Я хотел бы знать, почему результаты отличаются, спасибо! (Моя bash версия 5.0.11)

1 Ответ

1 голос
/ 30 января 2020

help declare говорит

При использовании в функции declare делает ИМЕНИ локальными , как с командой local.

Это означает, что за пределами createArr, array1 не объявлено. И присвоение, подобное array1[1]=1, где array1 не установлено, подразумевает, что array1 является обычным индексированным массивом.

Использование флага -g в вашей функции исправляет это, хотя

createArr() { declare -gA "$1"; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...