You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:27:19