То, что у вас есть, должно работать, если у вас есть версия Bash, которая для начала поддерживает ассоциативные массивы.
Если я могу сделать дикое предположение.,,у вас работает что-то вроде этого:
command_that_outputs_keys \
| while read data; do
results[$data]=1
done
?То есть ваша while
петля является частью конвейера?Если так, то в этом проблема.Видите ли, каждая команда в конвейере получает копию среды выполнения оболочки.Таким образом, цикл while
будет заполнять копию массива results
, а когда цикл while
завершится, эта копия исчезнет.
Отредактировано, чтобы добавить: Если это является проблемой, то, как Гленн Джекман указывает в комментарии, вы можете исправить это, используя подстановка процесса вместо:
while read data; do
results[$data]=1
done < <(command_that_outputs_keys)
Таким образом, хотя command_that_outputs_keys
получит только копию среды выполнения оболочки (как и раньше), цикл while
будет иметь исходную основную среду, поэтому может изменять исходный массив.