Когда обрабатываем многострочный вывод - часто используем while read, но есть более быстрый способ:
mapfile (синоним - readarray).❓ Что делает mapfile? Читает строки из stdin или команды сразу в массив, построчно:
mapfile -t lines < input.txt
# теперь ${lines[0]}, ${lines[1]} и т.д. - отдельные строки
Аналог:
readarray -t lines < input.txt
Флаг -t удаляет \n на конце строк.
▪️ Обработка вывода команд:
mapfile -t users < <(cut -d: -f1 /etc/passwd)
for user in "${users[@]}"; do
echo "Пользователь: $user"
done
▪️ Фильтрация и трансформация. Комбинируем с grep, awk, sort, uniq:
mapfile -t services < <(systemctl list-units --type=service | awk '/running/ {print $1}')
for svc in "${services[@]}"; do
echo "Активный сервис: $svc"
done
▪️ Срезы и подмассивы. Работа с частями:
mapfile -t logs < <(tail -n 100 /var/log/syslog)
# последние 5 строк
printf '%s\n' "${logs[@]: -5}"
▪️ Использование с read-only входом:
some_func() {
local lines=()
mapfile -t lines
echo "Прочитано строк: ${#lines[@]}"
}
cat /etc/passwd | some_func
BashTex 📱 #bash #utils