![检查“字符串”是否是现有设备名称而不是分区名称](https://linux22.com/image/1071785/%E6%A3%80%E6%9F%A5%E2%80%9C%E5%AD%97%E7%AC%A6%E4%B8%B2%E2%80%9D%E6%98%AF%E5%90%A6%E6%98%AF%E7%8E%B0%E6%9C%89%E8%AE%BE%E5%A4%87%E5%90%8D%E7%A7%B0%E8%80%8C%E4%B8%8D%E6%98%AF%E5%88%86%E5%8C%BA%E5%90%8D%E7%A7%B0.png)
例如,如果我有一个现有的设备变量/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.