Linux脚本实现Swap容量统计与使用率计算:单位转换报错解决
解决带单位的交换空间数值计算问题
我来帮你搞定这个坑!你遇到的value too great for base错误,本质是bash没法直接把带M/G后缀的字符串当成数字来做算术运算——它会把22M当成一个非法的数字格式。咱们得先把这些带单位的数值转换成统一的纯数字单位(比如MB),再计算使用率。
下面是完整的实现方案,我会一步步拆解:
核心思路
- 从
pgsize和pgused中拆分出纯数字部分和单位部分 - 将所有数值转换为统一的单位(这里选MB,方便计算)
- 用转换后的纯数字计算使用率,支持整数或小数精度
完整脚本示例
#!/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
相关产品推荐
相关产品推荐

