1. 为什么你应该学习Bash脚本?
我至今记得第一次用Bash脚本自动化处理日志文件时的震撼——原本需要手动操作3小时的工作,20行代码10秒完成。那一刻我意识到,重复劳动是对生命最大的浪费。Bash作为Linux/Unix系统的原生语言,能直接调用系统命令,是自动化处理的终极武器。
现代开发者即使不用Linux服务器,日常也会频繁接触Bash环境。比如:
- 通过Git Bash在Windows上执行版本控制
- 使用curl命令下载安装脚本(如
curl -fssl https://example.com/install.sh | bash) - 在Docker容器中运行初始化脚本
- 通过SSH远程执行批量操作
注意:直接从网络执行脚本(特别是
| bash管道操作)存在安全风险,应检查脚本内容或使用可信来源
2. 环境准备:跨越第一个门槛
2.1 选择你的战场
- Linux/macOS:终端直接可用,输入
bash --version验证 - Windows:
- Git Bash(推荐):轻量级,包含常用工具
- WSL:完整的Linux子系统
- Cygwin:模拟Linux环境
bash复制# 验证安装(所有平台通用)
$ echo $SHELL
/bin/bash # 出现类似输出说明环境正常
2.2 编辑器配置
新手推荐VS Code:
- 安装Bash扩展(ID:mads-hartmann.bash-ide-vscode)
- 开启"Shellcheck"静态检查
- 设置行尾符为LF(Unix格式)
bash复制# 快速测试编辑器配置
#!/bin/bash
echo "Hello Terminal!" > test.sh
chmod +x test.sh
./test.sh
3. Bash脚本核心语法精要
3.1 让脚本可执行的基础结构
每个脚本必须包含shebang(指定解释器)和权限设置:
bash复制#!/bin/bash
# 注释:脚本描述
set -euo pipefail # 安全防护三件套
关键参数说明:
-e:遇到错误立即退出-u:使用未定义变量时报错-o pipefail:管道命令中任意失败则整体失败
3.2 变量操作的艺术
bash复制name="Alice" # 等号两边不能有空格
count=42
files=$(ls) # 命令输出赋值
echo "Hello ${name}" # 推荐大括号语法
echo "你有${count}个文件:$files"
易错点:变量默认全局,函数内用
local声明局部变量
3.3 流程控制实战
条件判断:
bash复制if [[ -f "log.txt" ]]; then
echo "文件存在"
elif (( $count > 0 )); then
echo "计数为正"
else
echo "其他情况"
fi
循环处理:
bash复制# 遍历文件
for file in *.txt; do
wc -l "$file"
done
# 数字范围
for i in {1..5}; do
echo "第${i}次测试"
done
4. 真实案例:日志分析自动化
假设每天需要:
- 下载服务器日志
- 统计各状态码出现次数
- 提取错误信息
- 发送摘要邮件
原始手动操作约需25分钟,脚本实现如下:
bash复制#!/bin/bash
set -euo pipefail
# 1. 下载日志
log_url="https://example.com/logs/$(date +%Y-%m-%d).log"
curl -fsSL "$log_url" > access.log
# 2. 状态码统计
echo "状态码统计:"
awk '{print $9}' access.log | sort | uniq -c
# 3. 错误提取
grep -E ' 50[0-9] ' access.log > errors.log
# 4. 邮件发送
mailx -s "每日日志摘要" admin@example.com <<EOF
统计结果见附件
错误数量:$(wc -l < errors.log)
EOF
优化技巧:
- 添加
-z参数检查是否已处理过当日日志 - 使用
logger命令写入系统日志 - 通过
crontab -e设置每日自动运行
5. 避坑指南:我踩过的7个坑
5.1 权限问题
bash复制bash: ./script.sh: Permission denied
解决方案:
bash复制chmod +x script.sh # 添加执行权限
./script.sh # 正确执行方式
5.2 路径问题
bash复制bash: pnpm: command not found
原因分析:
- 命令不在
$PATH中 - 脚本执行目录与预期不符
修复方案:
bash复制# 显式指定路径
/usr/local/bin/pnpm install
# 或临时添加PATH
export PATH="/custom/path:$PATH"
5.3 格式错误
bash复制bash: line 1: syntax error near unexpected token
常见原因:
- Windows换行符(CRLF)导致
- 中文标点混入
- 变量引用未闭合
快速检测:
bash复制cat -A script.sh # 显示隐藏字符
dos2unix script.sh # 转换换行符
6. 效率提升技巧
6.1 彩色输出
bash复制RED='\033[0;31m'
NC='\033[0m' # No Color
echo -e "${RED}错误信息${NC}"
6.2 进度显示
bash复制for i in {1..100}; do
printf "\r处理中:%d%%" $i
sleep 0.1
done
echo # 换行
6.3 参数处理
bash复制while getopts "f:o:" opt; do
case $opt in
f) input_file="$OPTARG" ;;
o) output_dir="$OPTARG" ;;
?) echo "用法:$0 -f 输入文件 -o 输出目录"; exit 1 ;;
esac
done
7. 从脚本到工具:进阶路线
当脚本超过300行时,建议:
- 模块化拆分:
bash复制source utils/logger.sh source lib/calc.sh - 添加单元测试(使用bats-core)
- 打包为可执行文件(shc编译器)
- 发布到内部仓库(如Artifactory)
我个人的项目演化路径:
- 单文件脚本 → 功能模块化 → 配置外部化 → 错误码标准化 → 文档自动化
8. 安全警示:脚本中的地雷
危险操作示例:
bash复制# 永远不要这样做!
rm -rf /${some_var} # 变量为空时将删除根目录
# 安全版本
[[ -n "$some_var" ]] && rm -rf "./${some_var}"
安全清单:
- 所有变量引用加双引号
- 禁用
eval命令 - 网络下载内容先校验再执行
- 敏感信息不硬编码在脚本中
9. 资源推荐
学习资料:
- 《Bash Pitfalls》——经典陷阱合集
- Google Shell Style Guide——代码规范
- explainShell.com——命令解析工具
实用工具:
- shellcheck——静态分析工具
- jq——JSON处理神器
- parallel——并行处理加速
我书桌上常备的速查表:
bash复制# 字符串操作
${str:0:5} # 子串
${str/old/new} # 替换
# 数组处理
arr=(a b c)
echo ${arr[@]} # 全部元素
echo ${#arr[@]} # 元素个数
10. 我的自动化实践心得
三年前我开始记录所有手动重复操作,累计识别出127个可自动化场景。如今我的日常工作流:
-
早间咖啡时间:
- 自动同步代码库(3个不同项目)
- 运行测试套件
- 生成当日任务列表
-
午后处理:
- 日志分析报告自动生成
- 服务器状态监控告警
- 数据库备份验证
-
下班前:
- 自动提交代码变更
- 生成日报邮件
- 清理临时文件
关键转变:从"遇到问题→手动解决"变为"遇到重复问题→编写解决脚本→永远不再手动处理"。这个思维转变让我每周至少节省10小时机械操作时间。
