данасо, вы указали список городов для каждого человека или вы указали каждый город отдельно? Вещи, кажется, работают хорошо для меня, когда я делаю первое. Вот (слегка отредактированная) стенограмма моей сессии Bash:
$ declare -A myArray=([emma]="paris london ny" [john]="tokyo LA")
Или, чтобы создать свой ассоциативный массив на лету, как в вашем «реальном коде», из обычных массивов, называемых names
и cities
, вы сначала должны создать эти массивы, например:
$ declare -a names=(emma john) # Notice: small '-a' for inexed array.
$ declare -a cities=("paris london ny" "tokyo LA") # Notice: Quotes around whole lists of cities!
Тогда я бы начал с пустого myArray
и собрал бы его в цикле, например:
$ declare myArray=()
for i in ${!names[@]}; do
name=${names[$i]}
city=${cities[$i]}
myArray+=([$name]=$city)
done
В качестве отступления: Когда-нибудь в будущем вы, возможно, захотите заполнить myArray
таким образом, но с разными записями в ваших cities
и names
. Если и когда вы это сделаете, это будет хорошим показателем для set -o noglob
до for
-циклов. Это отключает расширение имени пути оболочкой и защищает от неприятностей, когда у вас случайно есть имя или город с именем *
в одном из ваших массивов. Вы можете включить его с помощью set +o noglob
после for
-loop.
В любом случае, независимо от того, каким образом вы будете заполнять myArray
, новые города больше не будут заменять предыдущие, как вы можете видеть:
$ echo ${myArray[emma]}
paris london ny
$ echo ${myArray[john]}
tokyo LA
И вы можете обрабатывать города по отдельности, например, в этом for
-loop:
$ for city in ${myArray[emma]}; do echo "hello, $city!"; done
hello, paris!
hello, london!
hello, ny!
Как это работает для вас?
PS: Я хотел бы поблагодарить Чарльза Даффи за улучшения моего кода, которые он предложил в комментариях.