Bash readarray: загрузить строки в массив без потери

Категория: Bash · Язык: Bash · Обновлено:

В Bash встроенная команда readarray (синоним mapfile) читает стандартный ввод построчно в индексированный массив. Ключ -t удаляет завершающий перевод строки, но сохраняет пробелы и пустые символы внутри строки. Это удобнее, чем цикл while read, когда нужен готовый массив.

Прочитать строки в массив

Here-document передаёт тестовые строки команде без файлов и внешних процессов:

Bash
mapfile -t lines <<'EOF'
первый пункт
пункт с пробелом
EOF

printf '<%s>\n' "${lines[@]}"

Массив lines содержит два элемента. "${lines[@]}" передаёт каждый элемент отдельным аргументом и сохраняет пробелы; не заменяйте это на некавыченный $lines.

Прочитать файл

Для файла можно перенаправить стандартный ввод:

Bash
mapfile -t lines < ./items.txt
printf '%s\n' "${lines[@]}"

Пустой файл даст пустой массив. Для очень больших файлов учитывайте, что все строки одновременно занимают память. readarray входит в Bash 4+; в минимальных POSIX sh и старом Bash команда может отсутствовать.

Официальная справка: Bash builtins — mapfile/readarray.