Доступ к ассоциированному массиву bash через переменную - PullRequest
1 голос
/ 18 марта 2019

Я хочу получить доступ к ассоциативному массиву, используя переменную.Пример в принятом ответе на этот пост - это именно то, что я хочу:

$ declare -A FIRST=( [hello]=world [foo]=bar )
$ alias=FIRST
$ echo "${!alias[foo]}"

, однако это не работает для меня при использовании bash 4.3.48 или bash 3.2.57.Однако он работает, если я не объявляю («объявляю -A») массив, т.е. это работает:

$ FIRST[hello]=world 
$ FIRST[foo]=bar
$ alias=FIRST
$ echo "${!alias[foo]}"

Есть ли проблемы с не объявлением массива?

1 Ответ

1 голос
/ 18 марта 2019

Это работает так, как и ожидалось, вы просто пропустили определение еще одного уровня косвенности для доступа к значению,

declare -A first=()
first[hello]=world 
first[foo]=bar
alias=first
echo "${!alias[foo]}"     

Приведенный выше результат, очевидно, будет пустым, так как другой ответ указывает на то, что ссылка на ключ массива еще не создана. Теперь определите item, чтобы ввести второй уровень косвенной ссылки, чтобы указать на фактическое значение key.

item=${alias}[foo]
echo "${!item}"
foo

Теперь наведите пункт на следующую клавишу hello

item=${alias}[hello]
echo "${!item}"
world

Или более подробный пример: запустить цикл над ключами ассоциативного массива

# Loop over the keys of the array, 'item' would contain 'hello', 'foo'
for item in "${!first[@]}"; do    
    # Create a second-level indirect reference to point to the key value
    # "$item" contains the key name 
    iref=${alias}["$item"]
    # Access the value from the reference created
    echo "${!iref}"
done
...