mapfile и readarray

Тема дорожной карты · Bash

mapfile (также доступная как readarray) — это встроенная команда Bash, которая позволяет читать строки из стандартного ввода в индексированный массив. Это самый прямолинейный и эффективный способ заполнения массива из файла или вывода команды в Bash-скриптах. Использование mapfile улучшает как читаемость кода, так и производительность при работе с большими текстовыми файлами. Кроме того, mapfile предоставляет множество флагов для точного контроля над процессом чтения, что делает её незаменимой для автоматизации в Linux.

Как это работает

mapfile и readarray позволяют быстро и эффективно заполнить массив данными из стандартного ввода. Например, команда mapfile -t array < file.txt читает строки из файла file.txt и заполняет ими массив array, убирая конечные символы новой строки для каждого элемента массива. Флаг -t автоматически убирает символ новой строки, что позволяет избежать накладных расходов, связанных с использованием цикла while read. Дополнительно, mapfile поддерживает флаг -n для ограничения количества читаемых строк, -s для пропуска заголовочных строк и -d для разбиения по символам, отличным от символа новой строки, что даёт точный контроль в скриптах автоматизации Linux.

Когда применять

mapfile и readarray следует использовать, когда требуется заполнить массив данными из файла или вывода команды. Это особенно полезно при работе с большими текстовыми файлами, где использование цикла while read может привести к увеличению времени выполнения и усложнению кода. Кроме того, использование mapfile улучшает читаемость кода и упрощает управление данными в массиве.

Типичные ошибки

Одной из распространенных ошибок при использовании mapfile и readarray является неправильное использование массивов. Например, если вы используете конструкцию for x in ${arr[@]}, элементы массива могут быть разделены на несколько итераций, если они содержат пробелы. Для предотвращения этой ошибки всегда используйте конструкцию "${arr[@]}" при итерации массива. Другой распространенной ошибкой является использование старого синтаксиса для ассоциативных массивов в Bash версии 3.2, который не поддерживает ассоциативные массивы. В таких случаях рекомендуется использовать более новую версию Bash.

Связанные понятия

Полезные ресурсы