跳到主要内容

常用 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 确认