Известно, что встроенные mapfile
/ 1002 * в bash
создают индексированные массивы только . Поскольку вы не предоставляете никакого ограничителя для разделения содержимого входного файла, команда просто создает одну запись в массиве для каждой из имеющихся строк ввода.
Если вы хотите создать ассоциативный массив сзначения перед :
должны использоваться в качестве ключей, вам необходим цикл while
, который разбирает каждую строку, разбивая ее на :
, и объявляет массив для явного использования в качестве ассоциативного. Обратите внимание, что ассоциативные массивы доступны только в версиях больше 4.
# declares an explicit associative array
declare -A countries
while IFS=: read -r key value; do
countries["$key"]="$value"
done < "$file"
теперь этот массив может быть зациклен на индексах, а элементы могут быть напечатаны как
for cap in "${!countries[@]}"; do
printf '%s\n' "$cap" "${countries[$cap]}"
done
См. BashGuide / Arrays для получения более подробной информации о том, как использовать различные типы массивов в bash
.