小易说IT 小易说IT

Linux 常见 Shell 脚本类型 & 常用脚本示例

Linux 默认 shell:bash(最常用),还有 sh、zsh、dash;脚本后缀一般 .sh,后缀不是强制,靠文件头 #!/bin/bash 识别解释器。

一、日常高频 Shell 脚本分类

  1. 系统运维脚本:日志清理、磁盘监控、服务启停、备份、定时巡检

  2. 文件处理脚本:批量重命名、批量压缩解压、文件迁移、MD5 校验

  3. 网络脚本:端口检测、ping 批量探测、下载上传、防火墙配置

  4. 应用部署脚本:软件一键安装、容器预处理、服务初始化

  5. 数据处理脚本:文本过滤、日志统计,结合 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 脚本常用内置工具(脚本里高频调用)

工具

用途

awk

列处理,日志解析,数值统计

sed

文本替换、行删除、修改配置文件

grep

过滤匹配文本

find

遍历文件,按时间 / 大小筛选

xargs

批量参数传递

date

获取时间戳

bc

shell 数学计算

四、脚本开发最佳实践

  1. 开头加上 set -euo pipefail,脚本遇到错误自动退出,防止错误继续往下跑

  2. 变量使用双引号 "${var}",防止空格、特殊字符出错

  3. 脚本增加执行权限:chmod +x xxx.sh

  4. 调试运行:bash -x ./xxx.sh,打印每一步执行过程

  5. 定时任务使用 crontab -e,输出日志,不要直接丢弃全部输出

五、常见 shell 解释器区别

  • /bin/bash:绝大多数 Linux 默认,功能最全

  • /bin/sh:POSIX 标准 shell,功能精简,很多系统是 bash 软链接

  • /bin/dash:debian/ubuntu 默认 sh,速度快,语法限制多

  • /bin/zsh:交互式终端,写脚本一般不用


本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。

原文链接 https://yijunzhao.cc/archives/linux-shell-script-types-common-examples-guide

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/