你有没有遇到过这种情况:每天上班第一件事就是打开终端,输入一连串命令清理日志、备份文件、检查服务状态。重复操作做多了,手指都快抽筋了。其实,这些都可以交给 shell 脚本来干。
什么是shell脚本
简单说,shell 脚本就是一个文本文件,里面写满了 Linux 或 macOS 终端能执行的命令。你把命令一行行写进去,然后让系统按顺序自动跑一遍。就像给电脑写个“操作说明书”。
常见的 shell 有 bash、zsh 等,大多数情况下默认是 bash。我们写的脚本也通常以 .sh 结尾,比如 backup.sh、deploy.sh。
写一个最简单的脚本
打开文本编辑器,比如 nano 或 vim,新建一个文件叫 hello.sh:
#!/bin/bash
echo "你好,今天天气不错"
date第一行 #!/bin/bash 叫“shebang”,告诉系统用 bash 来运行这个脚本。后面两行是具体命令:打印一句话,再显示当前时间。
保存后,先给它执行权限:
chmod +x hello.sh然后运行:
./hello.sh你会看到输出:
你好,今天天气不错
Sun Apr 5 10:30:15 CST 2025加点变量让脚本更灵活
假如你想让脚本记住用户名,可以定义变量:
#!/bin/bash
name="小李"
echo "欢迎你,$name"变量名前加 $ 就能读取它的值。你也可以让用户自己输入:
#!/bin/bash
echo "请输入你的名字:"
read name
echo "你好,$name,欢迎回来"用if判断做选择
脚本也能做判断。比如检查某个文件是否存在:
#!/bin/bash
if [ -f "/tmp/data.log" ]; then
echo "日志文件存在,准备处理"
cat /tmp/data.log
else
echo "警告:日志文件不见了!"
fi中括号 [ ] 是 test 命令的简写,-f 表示“是不是一个存在的文件”。根据结果,脚本走不同的分支。
循环处理多个任务
要批量重命名一堆图片?用 for 循环:
#!/bin/bash
for img in *.jpg; do
if [ -f "$img" ]; then
mv "$img" "photo_$(date +%s)_$RANDOM.jpg"
fi
done这段脚本会把当前目录下所有 .jpg 文件重命名为 photo_ 开头的随机名字,避免重复。
实际应用场景
我在公司就写了个监控脚本,每分钟检查一次服务器内存使用率,超过80%就发提醒:
#!/bin/bash
mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
if (( $(echo "$mem_usage > 80" | bc -l) )); then
echo "内存告警:已使用 $mem_usage%" | mail -s "服务器告警" admin@example.com
fi再比如,每天早上自动同步项目代码:
#!/bin/bash
cd /home/user/project
git pull origin main
npm run build把这些脚本加到 crontab 定时任务里,彻底解放双手。
刚开始写脚本不用追求完美,先把重复动作记下来,一行行搬进文件里,再慢慢加逻辑。你会发现,原来每天花半小时做的事,现在一键搞定。