По крайней мере одна из строк, которые вы пытаетесь извлечь, может содержать пустые символы - это, вероятно, необычно, но ничто не мешает точке монтирования иметь пробелы на своем пути. Следовательно, анализ df
может работать не так, как ожидалось.
Учитывая, что вы находитесь на Linux, есть вероятность, что у вас есть df
из Coreutils . Он должен содержать удобную опцию --output
, которая позволяет указывать список полей для печати.
#!/bin/bash
for dev in /dev/sd*; do
printf '%s ' "$dev is mounted on"
printf '%s ' "$(df --output=target "$dev" | tail -n +2)"
printf '%s ' "and file system type is"
printf '%s\n' "$(df --output=fstype "$dev" | tail -n +2)"
done
Конечно, это работает правильно только в предположении, что точки монтирования и типы файловой системы могут не иметь завершающие символы новой строки (которые могут быть удалены путем подстановки команд; однако это может быть обойдено вокруг ).
Кроме того, вывод будет включать нежелательные элементы, если вы не убедитесь, что все пути к устройствам /dev/sd*
расширяется на самом деле установлены. Вы можете сделать это, например, добавив findmnt --source "$dev" 1>/dev/null || continue
в качестве первой команды внутри l oop. findmnt
предоставляется util- linux.
В качестве альтернативы, если у вас есть findmnt
, его опция -r
(необработанный формат вывода, все потенциально небезопасные символы - шестнадцатеричные можно использовать для обеспечения надежного синтаксического анализа его вывода:
findmnt -n -D -r -o source,target,fstype |
awk '{ print $1,"is mounted on",$2,"and file system type is",$3 }'
С дополнительными преимуществами по сравнению с моим предыдущим предложением эффективности (только два вызова внешних инструментов) и защиты от изменений в точках монтирования, которые может происходить между последовательными df
вызовами.
Другие используемые опции предназначены для удаления заголовков (-n
), вывода mimi c df
, необходимого для исключения псевдофайловых систем (-D
), и выбрать / заказать поля для печати (-o
).