shell脚本怎么用?手把手教你入门实用技巧

你有没有遇到过这种情况:每天上班第一件事就是打开终端,输入一连串命令清理日志、备份文件、检查服务状态。重复操作做多了,手指都快抽筋了。其实,这些都可以交给 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 定时任务里,彻底解放双手。

刚开始写脚本不用追求完美,先把重复动作记下来,一行行搬进文件里,再慢慢加逻辑。你会发现,原来每天花半小时做的事,现在一键搞定。