
Например, если у меня есть существующая переменная устройства /dev/sda
, я хочу проверить, что это не имя раздела, а всего диска.
Я пробовал это:
[[ $(df --output=source "$var" 2> /dev/null | tail -n 1) = 'udev' ]]
но это возвращает true var='/dev/sda'
, подключено ли устройство или раздел var='/dev/sda1'
не смонтирован.
Так что даже если вы объедините предыдущее условие со следующим:
if grep -sq "^$var " /proc/mounts; then ...
было бы недостаточно сказать, что это имя диска, а не раздела диска.
Как проверить, string
является ли a именем существующего устройства, а не именем раздела?
решение1
lsblk
Для этого можно использовать - в частности, lsblk -o type
следует возвращать либо part
(для раздела), либо disk
(для всего блочного устройства).
Так, например, дано:
$ lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 238.5G 0 disk
├─sda1 8:1 0 9.8G 0 part
├─sda2 8:2 0 164.7G 0 part
├─sda3 8:3 0 31.1G 0 part /
├─sda4 8:4 0 1K 0 part
├─sda5 8:5 0 15.3G 0 part /usr/local
└─sda6 8:6 0 17.7G 0 part /home
затем
$ var=/dev/sda; lsblk -ndo type "$var" | grep -qF part && echo "is a partition"
$ var=/dev/sda1; lsblk -ndo type "$var" | grep -qF part && echo "is a partition"
is a partition
или
$ var=/dev/sda; lsblk -ndo type "$var" | grep -qF disk && echo "is a disk"
is a disk
$ var=/dev/sda1; lsblk -ndo type "$var" | grep -qF disk && echo "is a disk"
решение2
Использовать lsblk
:
var="/dev/sda"
if lsblk "$var" &>/dev/null; then
echo "Is a disk."
else
echo "Is not a disk."
fi
Если "$var"
устройство недействительно, например var="/dev/sda1"
, , lsblk
то код выхода будет ненулевым.
Чтобы получить вывод всех устройств:
lsblk -dnp --output NAME
решение3
Использовать mountpoint
.
От man mountpoint
:
NAME
mountpoint - see if a directory or file is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory | file
mountpoint -x device
DESCRIPTION
mountpoint checks whether the given directory or file is mentioned in the
/proc/self/mountinfo file.