关于shell的简单用法
一、Shell 基础:变量、if、for 详细讲解
1. Shell 变量
变量就是给一段数据起个名字,方便后面反复用。
1.1 定义变量
格式:变量名 = 值⚠️ 注意:等号两边不能有空格
name="zhangsan" age=201.2 使用变量
用$变量名或${变量名}
echo $name echo "My name is $name" echo "Age is ${age}岁"1.3 命令结果存入变量(非常常用)
用$(命令)
now=$(date +"%Y-%m-%d %H:%M:%S") echo "当前时间:$now"1.4 脚本参数变量
执行脚本时传参:./test.sh a b c
$0 # 脚本本身名字 $1 # 第一个参数 $2 # 第二个参数 $# # 参数个数 $* # 所有参数1.5 常用系统变量
$HOME # 家目录 $PWD # 当前目录 $PATH # 命令搜索路径 $$ # 当前进程ID2. if 判断(核心)
Shell 中 if 语法固定格式:
if [ 条件 ]; then 命令1 elif [ 条件 ]; then 命令2 else 命令3 fi⚠️ 注意:
[后面必须有空格]前面必须有空格- 结尾必须是
fi
2.1 文件 / 目录判断(备份脚本必用)
-e file # 文件或目录是否存在 -f file # 是否是普通文件 -d file # 是否是目录 -s file # 文件大小是否大于0(非空)示例:
if [ -d /backup ]; then echo "备份目录已存在" else mkdir /backup fi2.2 数字比较
-eq 等于 -ne 不等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于示例:
a=10 if [ $a -gt 5 ]; then echo "a大于5" fi2.3 字符串比较
= 相等 != 不相等 -z 字符串为空str="hello" if [ "$str" = "hello" ]; then echo "匹配成功" fi2.4 多条件
if [ 条件1 ] && [ 条件2 ]; then # 并且 if [ 条件1 ] || [ 条件2 ]; then # 或者3. for 循环
用来重复执行命令。
3.1 遍历列表
for i in 1 2 3 4 5; do echo "数字:$i" done3.2 遍历文件
for file in *.log; do echo "处理文件:$file" done3.3 数字循环(C 语言风格)
for ((i=1; i<=10; i++)); do echo $i done二、文件备份脚本(完整 + 详细注释)
功能:
- 备份指定目录
- 自动按日期命名
- 自动创建备份目录
- 记录日志
backup.sh
#!/bin/bash # ==================== 配置区 ==================== # 要备份的目录 SRC_DIR="/home/test" # 备份存放目录 BAK_DIR="/backup" # 备份文件名(日期) BAK_NAME="backup_$(date +%Y%m%d_%H%M%S).tar.gz" # 日志文件 LOG_FILE="/backup/backup.log" # ================================================ # 判断备份目录是否存在,不存在则创建 if [ ! -d "$BAK_DIR" ]; then mkdir -p "$BAK_DIR" echo "$(date) 创建备份目录 $BAK_DIR" >> "$LOG_FILE" fi # 判断源目录是否存在 if [ ! -d "$SRC_DIR" ]; then echo "$(date) 错误:源目录 $SRC_DIR 不存在!" >> "$LOG_FILE" exit 1 fi # 开始备份 echo "$(date) 开始备份 $SRC_DIR → $BAK_DIR/$BAK_NAME" >> "$LOG_FILE" tar -zcvf "$BAK_DIR/$BAK_NAME" "$SRC_DIR" > /dev/null 2>&1 # 判断备份是否成功 if [ $? -eq 0 ]; then echo "$(date) 备份成功!" >> "$LOG_FILE" else echo "$(date) 备份失败!" >> "$LOG_FILE" fi使用方法
chmod +x backup.sh ./backup.sh三、系统 CPU / 内存监控脚本(完整详细)
功能:
- 获取 CPU 使用率
- 获取内存使用率
- 超过阈值输出警告
- 输出日志
monitor.sh
#!/bin/bash # ==================== 阈值配置 ==================== CPU_MAX=80 # CPU超过80%报警 MEM_MAX=85 # 内存超过85%报警 LOG_FILE="/var/log/monitor.log" # =================================================== # 获取CPU空闲率,计算使用率 CPU_IDLE=$(top -bn1 | grep Cpu | awk '{print $8}') CPU_USAGE=$(echo "100 - $CPU_IDLE" | bc) # 获取内存使用率 MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100}') # 记录时间 echo "==================== $(date) ====================" >> "$LOG_FILE" echo "CPU使用率:${CPU_USAGE}%" >> "$LOG_FILE" echo "内存使用率:${MEM_USAGE}%" >> "$LOG_FILE" # CPU报警 if (( $(echo "$CPU_USAGE > $CPU_MAX" | bc -l) )); then echo "警告:CPU使用率过高!${CPU_USAGE}%" >> "$LOG_FILE" fi # 内存报警 if (( $(echo "$MEM_USAGE > $MEM_MAX" | bc -l) )); then echo "警告:内存使用率过高!${MEM_USAGE}%" >> "$LOG_FILE" fi echo "" >> "$LOG_FILE"使用方法
chmod +x monitor.sh ./monitor.sh