如何为Shell磁盘选择脚本添加设备名、大小信息且保持$DISK变量不变
实现方法
核心逻辑不需要改动$DISK的生成规则,只要优化磁盘信息的读取方式,在遍历设备时同步拉取容量、型号等字段用于展示即可。注意不要用默认lsblk输出切空格的写法——这种方式遇到型号带空格、列对齐空格数变化时很容易取错值,直接用lsblk自定义输出字段的能力拿结构化数据最稳妥。
可直接替换的优化后代码
select_disk () { local count=0 local dev=() # 遍历所有物理磁盘,排除loop设备、光驱、虚拟块设备等非安装目标 # 输出字段顺序:设备名、容量、磁盘型号 while IFS=' ' read -r dev_name dev_size dev_model; do count=$((count+1)) dev[$count]="$dev_name" # 展示选项时带上额外信息 printf '%s: /dev/%s | 容量: %s | 磁盘型号: %s\n' "$count" "$dev_name" "$dev_size" "$dev_model" done < <(lsblk -d -n -e 7,11,252 -o NAME,SIZE,MODEL) read -rp "选择安装系统的磁盘(输入1-$count范围内的数字): " selection # 增加输入合法性校验,避免无效输入导致后续操作出错 if [[ ! $selection =~ ^[1-9][0-9]*$ ]] || (( selection > count )); then echo "输入无效,请重新选择" exit 1 fi # 完全沿用原有DISK变量生成规则,输出标准/dev/xxx路径 DISK="/dev/${dev[$selection]}" echo "$DISK" > /tmp/disk echo "已选择安装磁盘:$DISK" }
自定义调整说明
- 如果需要展示更多磁盘信息,直接在
lsblk的-o参数后追加字段名即可,常用可选字段:TRAN:磁盘总线类型,取值为nvme/sata/usb等,可用来区分外接U盘和本地磁盘ROTA:磁盘类型标识,值为1代表机械硬盘,值为0代表固态硬盘SERIAL:磁盘硬件序列号
- 代码中
lsblk的-e 7,11,252参数是用来排除不需要的设备:7对应loop设备、11对应光驱、252对应ZFS虚拟块设备,可根据自己的需求增减排除的设备号 - 数组
dev中存储的始终是纯设备名(如nvme0n1、sda),最终生成的$DISK变量完全符合/dev/设备名的标准路径规则,后续所有依赖该变量的脚本逻辑不需要做任何修改。
内容的提问来源于stack exchange,提问作者SM9
相关产品推荐
相关产品推荐

