Skip to content

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 batLinux sh
注释REM::#
输出echo helloecho "hello"
变量赋值set name=alice(无空格)name="alice"(无空格)
取变量%name%$name / "$name"
参数%1 %2 %*$1 $2 "$@"
拼接echo %name% okecho "$name ok"
条件相等if "%name%"=="alice"if [[ "$name" == "alice" ]]
数值比较if %n% gtr 18if (( n > 18 ))
文件存在if exist a.txtif [[ -f a.txt ]]
目录存在if exist dir\if [[ -d dir ]]
for 遍历for %%f in (*.log) do ...for f in *.log; do ...; done
while:loop ... goto loopwhile [[ $n -gt 0 ]]; do ...; done
调用其他脚本call other.bat./other.shsource other.sh
退出码exit /b 1exit 1
暂停pauseread -p "按回车继续"
延时timeout /t 3sleep 3
清屏clsclear
当前目录%cd% / cd$PWD / pwd
查进程tasklistps aux
杀进程taskkill /pid 123 /fkill -9 123
查端口占用netstat -ano | findstr :8080ss -ltnp | grep :8080lsof -i:8080
网络连通ping 127.0.0.1ping -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 也能跑

© 2026 开发速查