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