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

Linux脚本实现Swap容量统计与使用率计算:单位转换报错解决

解决带单位的交换空间数值计算问题

我来帮你搞定这个坑!你遇到的value too great for base错误,本质是bash没法直接把带M/G后缀的字符串当成数字来做算术运算——它会把22M当成一个非法的数字格式。咱们得先把这些带单位的数值转换成统一的纯数字单位(比如MB),再计算使用率。

下面是完整的实现方案,我会一步步拆解:

核心思路

  1. 从pgsize和pgused中拆分出纯数字部分和单位部分
  2. 将所有数值转换为统一的单位(这里选MB,方便计算)
  3. 用转换后的纯数字计算使用率,支持整数或小数精度

完整脚本示例

#!/bin/bash

# 替换成你实际获取pgsize和pgused的命令,比如从某个工具输出中提取
pgsize="16G"
pgused="22M"

# 第一步:拆分数值和单位
# 提取纯数字:去掉所有非数字字符
total_num=$(echo "$pgsize" | sed 's/[^0-9]//g')
# 提取单位:去掉所有数字字符
total_unit=$(echo "$pgsize" | sed 's/[0-9]//g')

used_num=$(echo "$pgused" | sed 's/[^0-9]//g')
used_unit=$(echo "$pgused" | sed 's/[0-9]//g')

# 第二步:转换为统一的MB单位
if [ "$total_unit" = "G" ]; then
    total_mb=$((total_num * 1024))  # 1G = 1024MB
elif [ "$total_unit" = "M" ]; then
    total_mb=$total_num
# 如果有K单位的需求,可以加下面的判断
# elif [ "$total_unit" = "K" ]; then
#     total_mb=$((total_num / 1024))
fi

if [ "$used_unit" = "G" ]; then
    used_mb=$((used_num * 1024))
elif [ "$used_unit" = "M" ]; then
    used_mb=$used_num
fi

# 第三步:计算使用率
# 整数百分比(bash原生整数运算)
usage_int=$(( (used_mb * 100) / total_mb ))
# 带两位小数的百分比(用bc工具实现浮点运算)
usage_float=$(echo "scale=2; ($used_mb * 100) / $total_mb" | bc)

# 输出结果
echo "Total Swap Size: $pgsize ($total_mb MB)"
echo "Used Swap Size: $pgused ($used_mb MB)"
echo "Swap Usage: $usage_int% (精确到两位小数为 $usage_float%)"

关键细节说明

  • 用sed 's/[^0-9]//g'快速提取数字:这个正则会删掉所有非数字字符,留下纯数字部分
  • 单位转换逻辑:如果是G就乘以1024转成MB,M直接保留数值,要是有K的话可以除以1024(bash整数除法会自动取整)
  • 浮点计算依赖bc工具:大部分Linux发行版默认都有,如果没有可以用apt install bc或yum install bc安装

运行这个脚本后,就能得到你想要的总交换空间、已用空间和使用率,再也不会出现单位导致的计算错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:25:22