檢查“字串”是否是現有設備名稱而不是分區名稱

檢查“字串”是否是現有設備名稱而不是分區名稱

例如,如果我有一個現有的設備變量/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 ...

僅僅說它是磁碟名稱而不是磁碟分割區是不夠的。

如何檢查 a 是否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.

相關內容