Linux 默认 shell:bash(最常用),还有 sh、zsh、dash;脚本后缀一般
.sh,后缀不是强制,靠文件头#!/bin/bash识别解释器。
一、日常高频 Shell 脚本分类
系统运维脚本:日志清理、磁盘监控、服务启停、备份、定时巡检
文件处理脚本:批量重命名、批量压缩解压、文件迁移、MD5 校验
网络脚本:端口检测、ping 批量探测、下载上传、防火墙配置
应用部署脚本:软件一键安装、容器预处理、服务初始化
数据处理脚本:文本过滤、日志统计,结合 awk/sed/grep
脚本第一行(shebang)
#!/bin/bash
# 注释:描述脚本功能
set -euo pipefail # 健壮性:出错退出、未定义变量报错、管道错误传递
二、高频实用脚本示例(可直接复制使用)
1. 磁盘空间告警脚本(运维巡检)
disk_check.sh
#!/bin/bash
# 磁盘使用率监控,超过85输出告警
THRESHOLD=85
df -h | grep -v tmpfs | grep -v loop | awk 'NR>1 {print $5,$1}' | while read use dev;do
per=${use%\%}
if [ $per -ge $THRESHOLD ];then
echo "⚠️告警:磁盘 $dev 使用率 ${use}"
fi
done
执行:chmod +x disk_check.sh && ./disk_check.sh
2. 日志自动清理脚本(按天数删除旧日志)
clean_log.sh
#!/bin/bash
# 删除 /var/log 下7天以上的 *.log 文件
LOG_DIR="/var/log"
find ${LOG_DIR} -name "*.log" -mtime +7 -delete
echo "[$(date)] 旧日志清理完成" >> /var/log/clean_log.log
配合 crontab 定时:0 2 * * * /root/clean_log.sh 每天凌晨 2 点执行
3. 批量端口探测脚本
port_scan.sh
#!/bin/bash
HOST="127.0.0.1"
PORTS=(22 80 443 3306 6379)
for p in "${PORTS[@]}";do
if timeout 1 bash -c "</dev/tcp/${HOST}/${p}" 2>/dev/null;then
echo "✅ $HOST:$p open"
else
echo "❌ $HOST:$p closed"
fi
done
4. 文件备份脚本(压缩 + 时间戳)
backup.sh
#!/bin/bash
SRC="/data/app"
DST="/data/backup"
TIME=$(date +%Y%m%d_%H%M%S)
mkdir -p ${DST}
tar -zcf ${DST}/app_backup_${TIME}.tar.gz ${SRC}
# 保留最近10份备份,删除旧的
ls -t ${DST}/app_backup_*.tar.gz | tail -n +11 | xargs rm -f
echo "备份完成: ${DST}/app_backup_${TIME}.tar.gz"
5. 批量遍历目录做 MD5 校验
md5_check.sh
#!/bin/bash
DIR="$1"
if [ -z "$DIR" ];then
echo "用法 $0 目录路径"
exit 1
fi
find "$DIR" -type f -print0 | xargs -0 md5sum > md5sum_list.txt
echo "校验结果输出到 md5sum_list.txt"
6. 简单服务启停模板(自定义应用)
app_service.sh
#!/bin/bash
APP_NAME="demo-app"
PID_FILE="/var/run/demo.pid"
case "$1" in
start)
nohup java -jar demo.jar > app.log 2>&1 &
echo $! > $PID_FILE
echo "$APP_NAME 已启动"
;;
stop)
if [ -f $PID_FILE ];then
kill $(cat $PID_FILE)
rm -f $PID_FILE
echo "$APP_NAME 已停止"
fi
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2>/dev/null;then
echo "$APP_NAME 运行中"
else
echo "$APP_NAME 未运行"
fi
;;
*)
echo "用法 $0 {start|stop|restart|status}"
esac
7. 文本日志统计示例,统计错误行数
#!/bin/bash
LOGFILE="./app.log"
ERR_COUNT=$(grep -i "error" "$LOGFILE" | wc -l)
echo "日志中error总行数: $ERR_COUNT"
三、Shell 脚本常用内置工具(脚本里高频调用)
四、脚本开发最佳实践
开头加上
set -euo pipefail,脚本遇到错误自动退出,防止错误继续往下跑变量使用双引号
"${var}",防止空格、特殊字符出错脚本增加执行权限:
chmod +x xxx.sh调试运行:
bash -x ./xxx.sh,打印每一步执行过程定时任务使用
crontab -e,输出日志,不要直接丢弃全部输出
五、常见 shell 解释器区别
/bin/bash:绝大多数 Linux 默认,功能最全/bin/sh:POSIX 标准 shell,功能精简,很多系统是 bash 软链接/bin/dash:debian/ubuntu 默认 sh,速度快,语法限制多/bin/zsh:交互式终端,写脚本一般不用
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问