「文字列」がパーティション名ではなく既存のデバイス名であるかどうかを確認します

「文字列」がパーティション名ではなく既存のデバイス名であるかどうかを確認します

たとえば、既存のデバイス変数がある場合/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いずれかを返す必要があります。partdisk

たとえば次のようになります:

$ 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.

関連情報