Подтвердить что ты не робот

Ассоциативные массивы по умолчанию являются локальными

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

#!/bin/bash

f() {
    declare -A map
    map[x]=a
    map[y]=b
}

f
echo x: ${map[x]} y: ${map[y]}

выводит результат:

x:  y:

пока этот

#!/bin/bash

declare -A map

f() {
    map[x]=a
    map[y]=b
}

f
echo x: ${map[x]} y: ${map[y]}

выводит результат:

x: a y: b

Можно ли объявить глобальный ассоциативный массив внутри функции? Или что можно использовать?

4b9b3361

Ответ 1

От: Greg Wooledge
Отправлено: Вт, 23 авг. 2011 06:53:27 -0700
Тема: Re: YAQAGV (еще один вопрос о глобальных переменных)

bash 4.2 добавляет "declare -g" для создания глобальных переменных изнутри функция.

Спасибо, Грег! Однако у Debian Squeeze все еще есть Bash 4.1.5

Ответ 2

Вы уже ответили на свой вопрос с объявлением -g. Обходной путь в версиях bash 4.2 - объявить массив вне функции.

f() {
   map[y] = foo
}

declare -A map
foo
echo "${map[y]}"

Ответ 3

Хорошо, 4.2 добавляет "declare -g", но он не работает для ассоциативных массивов, поэтому он (пока) не отвечает на вопрос. Здесь мой отчет об ошибке и Чет подтверждают, что исправление запланировано для следующей версии.

http://lists.gnu.org/archive/html/bug-bash/2013-09/msg00025.html

Но я уверенно нашел обходное решение, вместо того, чтобы объявлять массив и назначать ему начальное значение в одно и то же время, сначала объявить массив, а затем выполнить назначение. То есть, не делайте этого:

declare -gA a=([x]=1 [y]=2)

но вместо этого:

declare -gA a; a=([x]=1 [y]=2)