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

使用dd限制写入时,awk变量获取磁盘大小出现异常的问题求助

问题分析与脚本修复

你的脚本核心问题是没有将用户选择的磁盘与lsblk输出做关联过滤,导致awk匹配所有磁盘行,输出所有容量。以下是具体问题点和修复方案:

原脚本的问题

  1. 变量$disk在echo -n "$drivelist\nSelect $disk:"中未赋值,会显示空字符串,提示信息不清晰。
  2. lsblk | awk -v disk="$disk" '/disk/ {printf "%.0f\n", $4}'中,/disk/会匹配所有包含"disk"的行(比如每块磁盘的TYPE=disk行),没有针对用户选中的磁盘做过滤;同时直接用$4取容量不可靠,lsblk的列顺序可能随环境变化。
  3. 处理容量单位的tr -d 'M|G|T'会丢失单位信息,无法准确转换为统一数值(比如1G和1M的数值量级完全不同)。

修复后的脚本(按行号选择磁盘)

这个版本让用户通过行号选择磁盘,更直观:

#!/bin/bash
# 列出所有独立磁盘(排除分区),添加行号
drivelist=$(lsblk --nodeps --noheadings --output NAME,SIZE,MODEL,MOUNTPOINT | nl)
echo "$drivelist"
read -p "请选择磁盘对应的行号: " disk_num

# 根据行号提取磁盘名
disk_name=$(echo "$drivelist" | awk -v num="$disk_num" '$1 == num {print $2}')

# 验证磁盘是否存在
if [ -z "$disk_name" ] || ! lsblk "/dev/$disk_name" >/dev/null 2>&1; then
    echo "错误:选择的磁盘不存在"
    exit 1
fi

# 获取磁盘的字节容量(dd命令用字节计数更准确)
disk_size_bytes=$(lsblk --nodeps --noheadings --output SIZE --bytes "/dev/$disk_name")
echo "选中磁盘 $disk_name 的容量(字节): $disk_size_bytes"

# 可选:转换为GB单位(适合人类阅读)
disk_size_gb=$((disk_size_bytes / 1024 / 1024 / 1024))
echo "选中磁盘 $disk_name 的容量(GB): $disk_size_gb"

修复后的脚本(直接输入磁盘名)

如果习惯直接输入磁盘名(比如sda),可以用这个版本:

#!/bin/bash
# 列出所有可选磁盘
echo "可用磁盘列表:"
lsblk --nodeps --noheadings --output NAME,SIZE,MODEL,MOUNTPOINT
read -p "请输入磁盘名(例如sda): " disk_name

# 验证磁盘有效性
if ! lsblk "/dev/$disk_name" >/dev/null 2>&1; then
    echo "错误:磁盘 $disk_name 不存在"
    exit 1
fi

# 获取字节容量
disk_size_bytes=$(lsblk --nodeps --noheadings --output SIZE --bytes "/dev/$disk_name")
echo "磁盘 $disk_name 的容量(字节): $disk_size_bytes"

更健壮的容量提取方式

如果需要避免列顺序问题,可以用lsblk的键值对输出(-P参数),确保准确获取容量:

# 替换容量提取的行
disk_size_bytes=$(lsblk --nodeps --noheadings -P --output SIZE --bytes "/dev/$disk_name" | awk -F'"' '{print $2}')

内容的提问来源于stack exchange,提问作者valors60

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:47:41