task1 shell 后面验证
以下是对该Shell脚本的逐行详细解释,包含命令原理、变量逻辑和细节补充:
1. 脚本解释器声明
#!/bin/bash
- 作用:指定脚本的执行环境为
/bin/bash
(Linux 下最常用的 Shell 解释器)。 - 意义:系统会调用
bash
来解析后续的命令,确保脚本语法被正确识别。
2. 获取CPU核心数
cpu=$(nproc)
- 命令解析:
nproc
:Linux 命令,用于获取系统可用的逻辑CPU核心数(若CPU支持超线程,会包含虚拟核心;例如,物理核心4、超线程开启时,nproc
可能返回8)。$(...)
:命令替换语法,将nproc
的输出结果赋值给变量cpu
。
- 注释争议:脚本注释称“物理核心,nproc更准确”,但实际
nproc
默认显示逻辑核心(物理核心需通过lscpu
计算,如物理核心 = 每插槽核心数 × 插槽数
)。
3. 获取内存容量(MB)
mem=$(free -m | awk 'NR==2 {print $2}')
- 命令拆解:
free -m
:以 MB 为单位显示内存状态(-m
指定单位为兆字节),输出示例:total used free shared buff/cache available Mem: 7859 1427 5236 14 1195 6078 Swap: 8191 0 8191
| awk 'NR==2 {print $2}'
:|
:管道符,将free -m
的输出传递给awk
处理。NR==2
:awk
的行号匹配,仅处理第2行(即Mem:
开头的行,对应物理内存数据)。print $2
:提取第2行的第2列(total
列,代表总内存容量,单位MB)。
- 最终,
mem
变量存储总内存容量(MB)。
4. 获取磁盘容量(根分区,GB)
disk=$(df -h / | awk 'NR==2 {gsub("G", "", $2); print $2}')
- 命令拆解:
df -h /
:查看根分区(/)的磁盘使用情况,-h
让容量以人类可读格式显示(如30G
),输出示例:Filesystem Size Used Avail Use% Mounted on /dev/sda1 30G 10G 20G 34% /
| awk 'NR==2 {gsub("G", "", $2); print $2}'
:NR==2
:处理第2行(即根分区的数据行)。gsub("G", "", $2)
:awk
的字符串替换函数,将第2列(Size
列,如30G
)中的G
替换为空字符串(去掉单位)。print $2
:输出处理后的数值(如30
),代表根分区的总容量(单位为GB,因原单位是G
)。
- 最终,
disk
变量存储根分区的总容量(GB)。
5. 输出系统信息
echo "本机CPU核心数是 ${cpu},本机内存容量是 ${mem} MB,本机磁盘容量是 ${disk} GB。"
- 语法解析:
echo
:输出字符串。${变量名}
:变量引用语法,确保cpu
、mem
、disk
的值被正确插入到字符串中。
- 效果:拼接三个变量的值,输出类似如下内容:
本机CPU核心数是 8,本机内存容量是 7859 MB,本机磁盘容量是 30 GB。
补充说明(潜在问题与扩展)
- CPU核心的误区:
- 若需物理核心数,可替换为:
cpu=$(lscpu | awk '/Core\(s\) per socket/ {core=$4} /Socket\(s\)/ {socket=$2} END {print core*socket}')
- 若需物理核心数,可替换为:
- 磁盘范围限制:
- 脚本仅统计根分区(/)的容量,若需整个磁盘(如
/dev/sda
),需修改为df -h /dev/sda
。
- 脚本仅统计根分区(/)的容量,若需整个磁盘(如
- 单位兼容性:
- 若磁盘容量单位是
M
(如小分区),gsub("G", ...)
会失效,需扩展逻辑(如判断单位并转换:G→GB,M→0.001GB
)。
- 若磁盘容量单位是
通过以上解析,可清晰理解脚本的每一步逻辑,以及实际应用中可能需要调整的细节。
修改成功 理解每一步可以出来
修改为命令错误 结论使用原来的
CPU核心数(物理核心,nproc更准确)
cpu=$(nproc)