Shell 脚本语言学习笔记

📅 2026/7/19 5:16:16
Shell 脚本语言学习笔记
一、基础命令1. echo 命令echo命令用于在屏幕上显示信息也可以将内容输出到文件。echotest# 在屏幕上输出 testechotest1.txt# 将 test 输出到 1.txt 文件中覆盖写入echotest1.txt# 将 test 输出到 1.txt 文件中追加写入cat1.txt# 将 1.txt 文件的内容输出到屏幕上说明如果文件不存在则创建如果文件存在则覆盖文件内容如果文件不存在则创建如果文件存在则追加文件内容2. 数据检索和编辑命令netstat-nltp# 显示所有监听端口和已连接端口包括进程IDnetstat-nltp|grep80# 显示包含 80 端口的连接信息3. 行检索命令grep801.txt# 在 1.txt 文件中检索包含 80 的行4. 字符串检索awk{print $1}work/com/1.txt# 打印该文件每行的第一列字段5. 交互式与非交互式命令类型命令说明交互式vim 1.txt在 vim 编辑器中打开 1.txt 文件非交互式sed -i s/test/123/g 1.txt直接修改文件内容全局替换sed 命令说明sed-is/test/123/g1.txt# -i直接修改文件内容# s替换命令# g全局替换global二、脚本基础1. 脚本文件规范Shell 脚本以.sh或.bash结尾脚本中#表示注释不会执行脚本首行指定解释器#!/bin/bash2. 执行脚本的方式bash1.sh# 方式一使用 bash 命令执行chmodx1.sh# 方式二先添加执行权限./1.sh# 然后直接执行三、变量1. 变量命名规则变量名只能以字母或下划线开头变量名只能包含字母、数字和下划线变量名不能以数字开头2. 变量定义与使用a10# 定义变量 a赋值为 10echo$a# 输出变量 a 的值即 10echoa# 输出字符串 a而不是变量值a$b# 将变量 b 的值赋值给变量 aecho$a# 输出变量 a 的值即 b 的值3. 时间变量shijian$(date)# 将当前时间赋值给变量 shijianecho$shijian# 输出当前时间shijian$(date%y%m%d_%H%M%S)# 格式年月日_时分秒echo$shijiantime$(date%y年%m月%d日_%H时%M分%S秒)# 中文格式echo$time四、脚本案例案例 1服务器初始化配置功能关闭 SELinux、防火墙、安装常用软件#!/bin/bash# 作者张三# 日期2023-08-01# 描述服务器初始化配置脚本# 版本1.0.0setenforce0# 关闭 SELinux 强制模式sed-is/enforcing/disabled/g/etc/selinux/config# 修改 SELinux 配置文件echo已关闭 selinuxsystemctl stop firewalld# 关闭防火墙服务systemctl disable firewalld# 禁用防火墙服务开机自启echo已关闭防火墙yuminstallvimtarunzipnet-toolswgetnginx php php-fpm php-zip php-gd php-intl php-mysqlnd-y# yum 安装常用软件包echo已安装常用软件echo已完成服务器初始化配置!案例 2自动备份双副本数据库功能每天凌晨自动备份数据库压缩后存储到本地和 NFS 共享服务器清理 30 天前的本地备份#!/bin/bash# FileName: dbbackup.sh# Version: 1.0# Date: 2025-07-06# Author: baige# Description: the script for backup mysql of opencartshijiandate%y%m%d_%H%M%S# 注意使用反引号 执行命令# 数据库备份# -u用户名 -p密码 数据库名 备份文件路径mysqldump -uroot!-p2wsx#EDC oc202505 /beifen/opencart.sql 2 /dev/null# 2 /dev/null将错误输出重定向到空设备不显示任何信息# 压缩备份文件并删除原文件tar-czf/beifen/yasuo-$shijian.tar.gz /beifen/opencart.sql --remove-files2/dev/null# -czf创建压缩文件c-create, z-gzip, f-file# --remove-files压缩后删除原文件# 同步到 NFS 共享服务器双保险rsync/beifen/* /mnt/nfs_share# 删除本地 30 天前的备份文件find/beifen/-mtime30|xargsrm-rf# -mtime 30修改时间超过 30 天的文件# 记录日志echowell done! 备份时间为$shijian/shell/beifen.log验证方法chmodx dbbackup.sh# 给脚本添加执行权限./dbbackup.sh# 执行脚本# 查看本地备份目录ls-alh# 显示所有文件包括隐藏文件长格式人类可读大小# 查看共享目录信息df-hT# 显示文件系统类型、已用空间、总空间、可用空间、已用率# 查看日志文件cat/shell/beifen.log# 显示备份日志内容案例 3自动化部署邮件服务功能输入邮箱账户和授权密码一键完成邮件服务部署#!/bin/bash# FileName: smtp.sh# Version: 1.0# Date: 2025-07-07# Author: baige# Description: the script for smtp configuration# 提示邮箱需要开启 SMTP 服务并获取授权码read-p请输入邮箱服务商 [163/qq/126]: provider# 读取用户输入的邮箱服务商read-p请输入邮箱账号: account# 读取用户输入的邮箱账号read-p请输入邮箱授权码: password# 读取用户输入的授权码echo正在安装邮件服务 ... yuminstallmailxsendmail-y/dev/null# 安装 mailx 和 sendmail 软件包# 配置邮件客户端cat/etc/mail.rcEOF set from$account$provider.com # 设置发件人邮箱地址 set smtpsmtp.$provider.com # 设置 SMTP 服务器地址 set smtp-auth-user$account# 设置邮箱账号 set smtp-auth-password$password# 设置授权密码 set smtp-authlogin # 设置认证方式 EOFsystemctl startsendmail# 启动 sendmail 服务测试方法echo测试内容|mail-s测试主题baige_zhynet189.cn# -s指定邮件主题# 将测试内容发送到指定邮箱案例 4自动化监测恶意访问功能每小时检查 Web 访问日志统计访问次数最多的 IP如果超过 10000 次则发送邮件告警fwqcat/etc/hostname# 获取服务器主机名zdljsawk{print $1}/shell/log/access.log|sort-n|uniq-c|sort-rn|head-1|awk{print $1}# awk {print $1}提取 IP 地址# sort -n排序# uniq -c去重并统计次数# sort -rn按次数从大到小排序# head -1取访问次数最多的记录# awk {print $1}提取访问次数gjipawk{print $1}/shell/log/access.log|sort-n|uniq-c|sort-rn|head-1|awk{print $2}# awk {print $2}提取 IP 地址# 记录日志echo-e\ndate%m月%d日 %H时%M分最大连接数是$zdljs访问者IP地址是$gjip/shell/log/anti-dos.log# 判断是否超过阈值并发送告警if[$zdljs-gt10000]thenecho警告,服务器$fwq要炸,连接数达到$zdljs,攻击地址为$gjip|mail-s服务器受 dos 攻击警告baige_zhynet189.cnfi案例 5自动化监测 Nginx 服务功能持续监测 Nginx 服务状态如果异常则自动重启#!/bin/bashwhiletrue# 无限循环doif!netstat-nltp|grep80/dev/null# 判断端口 80 是否正常监听then# Nginx 异常重启服务echo$(date%y年%m月%d日%H时%M分%S秒)- Nginx 停止运行,正在重启 ... |tee-a/shell/log/nginx_error.log systemctl restart nginxelse# Nginx 正常运行echo$(date%y年%m月%d日%H时%M分%S秒)- Nginx 正常运行|tee-a/shell/log/nginx_normal.logfisleep3# 每 3 秒检查一次done相关命令systemctl status nginx# 查看 Nginx 服务状态systemctl restart nginx# 重启 Nginx 服务systemctl stop nginx# 停止 Nginx 服务cat/shell/log/nginx_error.log# 查看异常日志cat/shell/log/nginx_normal.log# 查看正常运行日志五、常用命令汇总命令功能echo输出信息cat显示文件内容grep检索匹配内容awk文本处理sed流编辑netstat网络状态systemctl系统服务管理yum包管理tar文件压缩rsync文件同步find文件查找date日期时间mail邮件发送