Разбор вывода команды оболочки в две переменные построчно
Я пишу сценарий, который выводит гистограмму размеров файлов / каталогов в каталоге. В настоящее время я получаю необходимые данные со строкой
array=($(du -sc * | sort -hr))
что приводит к каждой другой линии array
размер и каждая другая строка имя файла, соответствующее ему. Однако, если любое из имен файлов содержит пробелы, этот наивный подход не работает, потому что выходные данные разделяются на каждый пробел.
В основном, что я хочу сделать, это анализировать строку вывода построчно, чтобы из каждой строки я сначала получал символы до первого пробела (размер), а затем до остальной части строки (имя файла, которое может содержать или не содержать пространства). Я думал о чередовании IFS между пробелом и новой строкой, но не мог придумать, как именно я это сделаю.
Я бы предпочел, чтобы решение было переносимым между различными оболочками или, по крайней мере, для работы в ksh.
1 ответ
Способ читать построчно while read
цикл, и read
позволяет читать несколько полей:
names=() sizes=()
while read -r size name
do
echo "The file '$name' has size $size"
names+=("$name")
sizes+=("$size")
done < <(du -sc ./* | sort -hr)
./*
предотвращает проблемы с файлами, начинающимися с тире (для du
) и ведущие пробелы (для read
).