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)
浙公网安备 33010602011771号