主题
Shell 脚本(科普 + 命令)
一、是什么
文本文件,按顺序写 Shell 命令,逐行执行,用来自动化重复操作(部署、备份、定时任务)。
- Windows:
.bat(批处理) - Linux / Mac:
.sh(Shell 脚本)
二、通用脚本模板(含语法要点)
bash
#!/bin/bash
set -euo pipefail # 放开头:报错即停 / 未定义变量报错 / 管道任一步失败即失败
# === 变量 ===
name="alice" # 等号两边不能有空格;双引号里展开变量,单引号不展开
echo "hi $name"
echo "第1个参数: $1" # 参数 $1 $2 ... 全部 "$@" 个数 $#
echo "上条命令退出码: $?" # 0 成功,非0 失败
# === 条件判断 ===
if [[ "$name" == "alice" ]]; then echo "是"; fi
if (( age > 18 )); then echo "成年"; fi
if [[ -f "a.txt" ]]; then echo "是文件"; fi # -f 文件 -d 目录 -e 存在
# === 循环 ===
for f in *.log; do echo "$f"; done
while [[ $n -gt 0 ]]; do echo "$n"; n=$((n-1)); done
# === 函数 ===
my_func() {
local arg="$1"
echo "收到: $arg"
}
my_func "hello"常见坑:等号两边别加空格;变量务必加双引号 "$var";命令替换用 $(...),别用反引号。
三、实战脚本
服务健康检查
bash
#!/bin/bash
set -euo pipefail
SERVICE="nginx"
if systemctl is-active --quiet "$SERVICE"; then
echo "✅ $SERVICE 运行中"
else
echo "❌ $SERVICE 已停止,尝试重启..."
systemctl restart "$SERVICE"
fi日志清理(保留近 N 天)
bash
#!/bin/bash
set -euo pipefail
LOG_DIR="/var/log/app"
DAYS=7
find "$LOG_DIR" -name "*.log" -mtime +"$DAYS" -delete
echo "已清理 $DAYS 天前的日志:$LOG_DIR"端口占用查询(跨平台)
bash
# Windows (bat)
netstat -ano | findstr :8080
taskkill /pid 123 /f
# Linux (sh)
ss -ltnp | grep :8080 # 推荐
lsof -i tcp:8080 # 备选
kill -9 123四、bat 与 sh 命令对照
团队常跨 Windows(bat)与 Linux(sh)开发,按用途对照方便互相改写:
| 用途 | Windows bat | Linux sh |
|---|---|---|
| 注释 | REM 或 :: | # |
| 输出 | echo hello | echo "hello" |
| 变量赋值 | set name=alice(无空格) | name="alice"(无空格) |
| 取变量 | %name% | $name / "$name" |
| 参数 | %1 %2 %* | $1 $2 "$@" |
| 拼接 | echo %name% ok | echo "$name ok" |
| 条件相等 | if "%name%"=="alice" | if [[ "$name" == "alice" ]] |
| 数值比较 | if %n% gtr 18 | if (( n > 18 )) |
| 文件存在 | if exist a.txt | if [[ -f a.txt ]] |
| 目录存在 | if exist dir\ | if [[ -d dir ]] |
| for 遍历 | for %%f in (*.log) do ... | for f in *.log; do ...; done |
| while | :loop ... goto loop | while [[ $n -gt 0 ]]; do ...; done |
| 调用其他脚本 | call other.bat | ./other.sh 或 source other.sh |
| 退出码 | exit /b 1 | exit 1 |
| 暂停 | pause | read -p "按回车继续" |
| 延时 | timeout /t 3 | sleep 3 |
| 清屏 | cls | clear |
| 当前目录 | %cd% / cd | $PWD / pwd |
| 查进程 | tasklist | ps aux |
| 杀进程 | taskkill /pid 123 /f | kill -9 123 |
| 查端口占用 | netstat -ano | findstr :8080 | ss -ltnp | grep :8080 或 lsof -i:8080 |
| 网络连通 | ping 127.0.0.1 | ping -c 3 127.0.0.1 |
| 文件路径分隔 | \ | / |
bat 变量
%VAR%易在复杂逻辑里出问题;sh 变量务必加双引号防空格。想一套脚本跨平台,可用 Node/Python,或用 Git Bash / WSL 在 Windows 跑 sh。
五、定时任务(crontab)
# 格式:分 时 日 月 星期 命令
30 2 * * * /data/backup.sh >> /data/backup.log 2>&1 # 每天 02:30 跑
*/5 * * * * /data/health_check.sh # 每 5 分钟crontab -e编辑;crontab -l查看。
六、运行权限
bash
chmod +x script.sh # 加可执行权限
./script.sh # 运行
bash script.sh # 不用 +x 也能跑