lsblk -n 不够纯净是因为默认带表头、缩进和树形层级;需加 -n(去表头)、-o name(仅名称列)、-d(仅磁盘)才能输出每行一个无干扰设备名,如 sda、nvme0n1。

直接用 lsblk -N -n -o NAME 提取纯净设备名,跳过标题和缩进,适配 for 循环
为什么 lsblk -N 本身还不够“纯净”?
lsblk -N 启用“数字节点”模式(即显示设备编号而非符号链接),但它默认仍带表头、缩进和树形层级(如空格前缀)。这些干扰项会让 for dev in $(lsblk -N) 错误解析出空行、缩进字符串或表头(如 "NAME"),导致后续 fdisk、parted 等命令失败。
关键三参数:-n -o NAME -d(按需)
要获得真正可用于循环的每行一个设备名(如 sda、nvme0n1),必须组合:
-
-n:禁用表头(no header) -
-o NAME:只输出 NAME 列(不混入 TYPE、SIZE 等) -
-d(可选):仅显示磁盘设备(disk),排除分区(partition)、LVM、loop 等——适合只对物理/裸设备操作
示例命令:
lsblk -N -n -o NAME -d → 输出:
sda
nvme0n1
vdab
在 for 循环中安全使用(防空格、防换行符污染)
直接命令替换 $(...) 在含空格路径时有风险,但设备名(sda、nvme0n1)本身不含空格,所以可放心用。推荐写法:
for dev in $(lsblk -N -n -o NAME -d); do
echo "正在处理 /dev/$dev"
# 如:wipefs -a "/dev/$dev" 或 parted "/dev/$dev" mklabel gpt
done
若需兼容更复杂场景(如含 LVM 逻辑卷),去掉 -d 并加过滤:
for dev in $(lsblk -N -n -o NAME | grep -E '^[a-z]+[0-9]*$'); do
echo "/dev/$dev 是顶层块设备"
done
替代方案:用 findmnt 或 ls /sys/block/(更底层、更快)
如果只需物理磁盘名(不依赖 lsblk),这两个方式更轻量:
-
ls /sys/block/→ 直接列出所有注册块设备(sda、nvme0n1),无任何格式干扰 -
findmnt -D -n -o SOURCE | cut -d'/' -f4 | sort -u→ 提取挂载源中的设备名(适合关注已用设备)
例如:
for dev in /sys/block/*; do
basename "$dev"
done | while read d; do
echo "发现磁盘: $d"
done











