Bash readarray: загрузить строки в массив без потери
В Bash встроенная команда readarray (синоним mapfile) читает стандартный ввод построчно в индексированный массив. Ключ -t удаляет завершающий перевод строки, но сохраняет пробелы и пустые символы внутри строки. Это удобнее, чем цикл while read, когда нужен готовый массив.
Прочитать строки в массив
Here-document передаёт тестовые строки команде без файлов и внешних процессов:
mapfile -t lines <<'EOF'
первый пункт
пункт с пробелом
EOF
printf '<%s>\n' "${lines[@]}"Массив lines содержит два элемента. "${lines[@]}" передаёт каждый элемент отдельным аргументом и сохраняет пробелы; не заменяйте это на некавыченный $lines.
Прочитать файл
Для файла можно перенаправить стандартный ввод:
mapfile -t lines < ./items.txt
printf '%s\n' "${lines[@]}"Пустой файл даст пустой массив. Для очень больших файлов учитывайте, что все строки одновременно занимают память. readarray входит в Bash 4+; в минимальных POSIX sh и старом Bash команда может отсутствовать.
Официальная справка: Bash builtins — mapfile/readarray.