常用 Shell 自动化脚本
📜 将重复性操作封装为 Shell 脚本,能大幅降低手动工作量和出错率。
常用工具脚本
清理工程中所有 node_modules
#!/bin/bash
# clean-node-modules.sh
echo "查找并删除所有 node_modules..."
find . -name 'node_modules' -type d -prune | while read dir; do
echo "删除: $dir"
rm -rf "$dir"
done
echo "完成!"
批量重命名文件
#!/bin/bash
# batch-rename.sh 「前缀」 「展名」
PREFIX=$1
EXT=$2
for file in *.$EXT; do
mv "$file" "${PREFIX}_${file}"
echo "重命名: $file → ${PREFIX}_${file}"
done
Git 辅助脚本
一键同步并部署
#!/bin/bash
# deploy.sh
set -e # 遇错即停
BRANCH=${1:-main}
echo "同步最新代码..."
git checkout $BRANCH
git pull origin $BRANCH
echo "安装依赖..."
npm ci
echo "构建项目..."
npm run build
echo "部署完成!当前分支: $BRANCH"
查找含某关键词的所有提交
# 查找所有包含关键词的提交
git log --all --oneline --grep="bug fix"
# 查找指定时间范围内的提交
git log --after="2024-01-01" --before="2024-06-30" --oneline
# 一个完整的 git 更改报告
git log --since='1 week ago' --pretty=format:'%h %an %s' --no-merges
开发环境脚本
快速切换 Node 版本(nvm)
# .nvmrc 文件存在时自动切换
# 添加到 ~/.zshrc
autoload -U add-zsh-hook
load-nvmrc() {
local nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
批量添加 git tag
#!/bin/bash
# tag-release.sh v1.2.3
VERSION=$1
if [ -z "$VERSION" ]; then
echo "用法: $0 <版本>"
exit 1
fi
git tag -a "v$VERSION" -m "Release v$VERSION"
git push origin "v$VERSION"
echo "已发布标签: v$VERSION"
监控与运维脚本
检查端口占用
# 查看 3000 端口占用
lsof -i :3000
# 杀死占用当前端口的进程
kill $(lsof -ti :3000)
# 对应 macOS/Linux 的一行命令
fuser -k 3000/tcp # Linux
定期清理日志
#!/bin/bash
# cleanup-logs.sh
LOG_DIR="./logs"
DAYS=30
# 删除 30 天前的日志
find "$LOG_DIR" -name "*.log" -mtime +$DAYS -delete
echo "已删除 $DAYS 天前的日志"
# 查看占用空间
du -sh "$LOG_DIR"
Shell 脚本最佳实践
| 实践 | 方法 |
|---|---|
| 遇错即停 | set -e 放在脚本开头 |
| 调试输出 | set -x 打印每个执行的命令 |
| 检测参数 | [ -z "$1" ] && echo "缺少参数" && exit 1 |
| 引用变量 | 始终用 "$var" 包裹,防止空格问题 |
| 常量大写 | readonly LOG_DIR="./logs" |
常见误区
- 没有
set -e,中途命令失败脚本仍继续执行导致难以发现的错误 - 变量没有加引号,包含空格时计算异常
- 将敲死命令(
rm -rf /)立即执行,应先对变量进行 echo 确认