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

Bash处理dmidecode输出:按定位器分组计算内存总容量

解决dmidecode内存输出分组求和与多行变量赋值问题

首先,我来帮你搞定这个内存容量求和的需求,顺便解决多行输出赋值的小坑~你的目标是把A1/A2的内存容量相加、B3/B4的也分别求和,同时要正确处理多行输出的变量赋值,下面是具体的实现方案:

步骤1:正确捕获多行输出到变量

你之前尝试的IFS='--'方式不太适配这个场景,因为每条内存信息是独立的一行,更可靠的方式是直接把输出捕获到变量,或者用while read逐行处理。

如果是用你已经给出的固定输出,可以用here-document赋值:

# 将你的dmidecode输出内容赋值给变量
memory_data=$(cat <<EOF
Size: 32 GB Form Factor: DIMM Set: 3 Locator: A1
Size: 16 GB Form Factor: DIMM Set: 3 Locator: A2
Size: 32 GB Form Factor: DIMM Set: 3 Locator: B3
Size: 16 GB Form Factor: DIMM Set: 3 Locator: B4
EOF
)

如果是直接从dmidecode实时提取(过滤掉冗余信息),可以用awk精准抓取需要的字段:

# 直接从dmidecode提取容量和定位器,每行格式为"容量 定位器"
memory_data=$(dmidecode --type memory | awk '/Size: [0-9]+ GB/ {cap=$2} /Locator: [A-Z0-9]+/ {print cap, $2}')

步骤2:分组求和的完整脚本

接下来我们逐行处理变量里的内容,判断每个内存条的定位器,分别累加A组和B组的容量:

# 初始化求和变量
sum_A=0
sum_B=0

# 逐行读取内存数据,自动分割出容量和定位器
while read -r capacity locator; do
    # 判断定位器所属分组,累加对应容量
    case "$locator" in
        A1|A2)
            sum_A=$((sum_A + capacity))
            ;;
        B3|B4)
            sum_B=$((sum_B + capacity))
            ;;
    esac
done <<< "$memory_data"

# 输出最终结果
echo "A组(A1+A2)总容量: ${sum_A} GB"
echo "B组(B3+B4)总容量: ${sum_B} GB"

脚本说明

  • 多行变量处理:while read -r ... done <<< "$memory_data"是处理多行变量最稳妥的方式,它会自动把变量内容按行拆分,逐行处理,避免了数组拆分的混乱。
  • 分组判断:用case语句可以灵活匹配多个定位器(比如A1/A2、B3/B4),逻辑清晰易维护。
  • 数值累加:用$((...))进行整数运算,直接把容量数值相加,不需要额外的字符串转换。

运行脚本后会得到预期结果:

A组(A1+A2)总容量: 48 GB
B组(B3+B4)总容量: 48 GB

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:35:07