以下是对 Linux Shell 中变量、方法(函数)、命名规则的详细说明,并结合 获取CPU负载并在负载超过2.0时发送邮件 的示例进行演示:
1. Shell 变量
命名规则
- 命名格式:变量名由字母、数字、下划线组成,不能以数字开头。
- 大小写敏感:
var
和VAR
是两个不同的变量。 - 避免保留字:如
if
,then
,else
等。 - 推荐风格:小写下划线式(如
cpu_load
)。
定义与使用
# 定义变量(等号两侧不能有空格!)
cpu_load=$(uptime | awk -F 'load average:' '{print $2}' | cut -d, -f1 | tr -d ' ')
# 使用变量(用 $ 符号引用)
echo "当前CPU负载: $cpu_load"
作用域
- 全局变量:默认情况下变量是全局的。
- 局部变量:在函数中用
local
定义:function check_load() { local threshold=2.0 # 局部变量 # ... }
2. Shell 方法(函数)
定义与调用
# 定义函数
send_email() {
local subject="$1" # 第一个参数
local body="$2" # 第二个参数
echo "$body" | mail -s "$subject" admin@example.com
}
# 调用函数
send_email "CPU警报" "CPU负载过高!当前值:$cpu_load"
返回值
- 函数默认返回最后一条命令的退出状态(
0
表示成功,非0
表示失败)。 - 可用
return
显式返回:check_load() { if (( $(echo "$1 > 2.0" | bc -l) )); then return 0 # 负载过高 else return 1 # 负载正常 fi }
3. 示例:监控CPU负载并发送邮件
完整脚本
#!/bin/bash
# 定义发邮件的函数
send_alert_email() {
local subject="CPU负载警报"
local message="当前CPU负载为 $1,超过阈值 2.0!"
echo "$message" | mail -s "$subject" admin@example.com # 替换为你的邮箱
}
# 获取当前CPU负载(1分钟内的平均值)
get_cpu_load() {
local load=$(uptime | awk -F 'load average:' '{print $2}' | cut -d, -f1 | tr -d ' ')
echo "$load"
}
# 主逻辑
main() {
local cpu_load=$(get_cpu_load)
echo "当前CPU负载: $cpu_load"
# 使用 bc 进行浮点数比较(因为Shell不支持直接比较浮点数)
if [[ $(echo "$cpu_load > 2.0" | bc -l) -eq 1 ]]; then
send_alert_email "$cpu_load"
echo "已发送警报邮件!"
else
echo "CPU负载正常。"
fi
}
# 执行主函数
main
关键点解释
-
获取CPU负载:
uptime
命令输出包含负载信息(如load average: 0.01, 0.02, 0.00
)。awk
截取负载部分,cut
提取第一个值(1分钟负载)。tr -d ' '
删除空格,确保值为纯数字(如0.01
)。
-
浮点数比较:
- Shell 无法直接比较浮点数,需借助
bc
命令:echo "1.5 > 2.0" | bc -l # 输出 0(假)或 1(真)
- Shell 无法直接比较浮点数,需借助
-
发送邮件:
- 依赖
mail
命令,需提前配置邮件服务(如安装postfix
或ssmtp
)。 - 测试邮件命令是否可用:
echo "测试内容" | mail -s "测试主题" your_email@example.com
- 依赖
4. 补充知识
变量操作
- 字符串拼接:
name="World" greeting="Hello, $name!" # 输出 Hello, World!
- 默认值:
echo ${undefined_var:-"默认值"} # 如果变量未定义,使用默认值
条件判断
- 数值比较:
if [ "$a" -gt "$b" ]; then # -gt 表示大于(仅限整数) if [[ $(echo "$a > $b" | bc) -eq 1 ]]; then # 浮点数比较
- 字符串比较:
if [ "$str1" = "$str2" ]; then # 判断相等
5. 脚本调试
- 检查语法错误:
bash -n script.sh
- 显示执行过程:
bash -x script.sh
通过以上内容,你可以掌握 Shell 变量、函数的基本用法,并实现一个实用的监控脚本!