检查“字符串”是否是现有设备名称而不是分区名称

检查“字符串”是否是现有设备名称而不是分区名称

例如,如果我有一个现有的设备变量/dev/sda,我想验证它不是分区的名称而是整个磁盘的名称。
我试过这个:

[[ $(df --output=source "$var" 2> /dev/null | tail -n 1) = 'udev' ]]

var='/dev/sda'但无论设备是否已连接,或者var='/dev/sda1'分区是否未挂载,此操作均返回 true 。
因此,即使你将前一个条件与以下条件结合起来:

if grep -sq "^$var " /proc/mounts; then ...

仅仅说它是一个磁盘名称而不是磁盘分区是不够的。

我如何检查是否string是现有设备名称而不是分区名称?

答案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.

相关内容