readarray: читаем вывод команды в массив без цикловЧасто в Bash список файлов или строк читают через
while read. Но если нужно просто получить все данные в массив, есть более короткий и быстрый способ - readarray (или его синоним mapfile).▪️Классический подход
files=()
while IFS= read -r file; do
files+=("$file")
done < <(find /var/log -name "*.log")
Работает, но код получается довольно громоздким.
▪️То же самое через
readarrayreadarray -t files < <(
find /var/log -name "*.log"
)
Теперь весь вывод команды сразу окажется в массиве
files.▪️Что делает ключ
-tБез него каждый элемент массива будет содержать символ новой строки (
\n) в конце.Практически всегда стоит использовать:
readarray -t lines < file.txt
Так строки попадут в массив уже без лишних символов.
▪️Работа с массивом
Например, узнать количество найденных файлов:
echo "${#files[@]}"Или пройтись по ним:
for file in "${files[@]}"; do
echo "$file"
done▪️Когда использовать не стоит
readarray считывает весь поток целиком. Если команда выводит миллионы строк или очень большой файл, массив займёт соответствующий объём памяти.В таких случаях потоковая обработка через
while read остаётся более подходящим вариантом.▪️Почему это важно
Во многих скриптах
while read используется просто по привычке. Если задача - получить список строк для дальнейшей работы, readarray делает то же самое в одну команду, сохраняя код компактным и избавляя от ручного заполнения массива.BashTex 📱 #bash #linux