什么是 Shell Script?从命令行到自动化脚本的跃迁
你有没有试过每天重复输入同样的命令?比如每天早上打开服务器后,先 cd /home/user/project,再 git pull origin main,接着 npm install,最后 npm run dev?如果每天都要手动敲一遍,不仅浪费时间,还容易出错。
这时候,Shell Script 就像一位“自动化助手”登场了。它能把你重复的操作封装成一个脚本文件,一键执行所有命令。简单来说,Shell Script 就是用 Shell 语言写的一系列命令组合,让计算机自动帮你完成任务。
Shell 是操作系统的命令行接口,常见的有 Bash(Bourne-Again Shell)、Zsh、Fish 等。我们通常说的 Shell Script,指的是用 Bash 编写的脚本,因为它在 Linux 和 macOS 系统中默认支持,兼容性最好。
想象一下,你写一个脚本,就像给电脑下一条“指令清单”:今天早上 8 点,打开文件夹,拉取最新代码,安装依赖,启动服务。只要执行这个脚本,一切自动完成。是不是很高效?
如何创建并运行一个 Shell Script?
要写一个 Shell Script,其实非常简单。我们从一个最基础的例子开始。
#!/bin/bash
echo "欢迎使用我的第一个 Shell Script!"
保存这段代码为 hello.sh。注意:文件名必须以 .sh 结尾,这是 Shell Script 的标准命名方式。
接下来,我们需要给这个脚本添加可执行权限。因为在 Linux 系统中,文件默认不能运行,必须显式授权。
chmod +x hello.sh
最后,运行脚本:
./hello.sh
💡 小贴士:如果你运行时报错“Permission denied”,说明没加执行权限,记得运行
chmod +x hello.sh。
这个例子虽然简单,但它展示了 Shell Script 的核心结构:shebang + 命令。只要掌握这些,你就能开始编写真正有用的脚本了。
变量与输入输出:脚本的“数据仓库”
在 Shell Script 中,变量是存储数据的容器。它们像一个个小盒子,可以放文本、数字、路径等信息。
#!/bin/bash
name="小明"
age=25
echo "我叫 $name,今年 $age 岁。"
变量在脚本中非常有用。比如你写一个备份脚本,需要指定源目录和目标路径,就可以用变量来配置:
#!/bin/bash
source_dir="/home/user/docs"
backup_dir="/backup/docs"
date=$(date "+%Y%m%d_%H%M%S")
mkdir -p "$backup_dir"
cp -r "$source_dir" "$backup_dir/backup_$date"
echo "备份已完成,路径:$backup_dir/backup_$date"
在这个例子中:
source_dir和backup_dir是变量,方便以后修改路径;date=$(date "+%Y%m%d_%H%M%S")使用命令替换,把当前时间存进变量;mkdir -p保证目录存在,即使多级路径也自动创建;"$var"用引号包裹变量,防止路径含空格导致错误。
🛠️ 提示:使用双引号包裹变量是好习惯,尤其当路径中包含空格时,避免脚本出错。
条件判断与循环:让脚本“会思考”
Shell Script 不只是按顺序执行命令,它还能根据条件做出判断,或者重复执行某段代码。这就像给脚本装上了“大脑”。
条件判断:if-else 语句
#!/bin/bash
if [ "$(whoami)" == "root" ]; then
echo "当前是管理员用户,可以执行高级操作。"
else
echo "当前用户不是管理员,请使用 sudo 执行。"
fi
循环:for 和 while
#!/bin/bash
echo "开始打印数字 1 到 5:"
for i in 1 2 3 4 5; do
echo "第 $i 次循环"
done
count=1
while [ $count -le 5 ]; do
echo "当前计数:$count"
count=$((count + 1))
# $(( )) 用于数学运算,这里实现 count = count + 1
done
这些控制结构让脚本不再“死板”,而是能根据情况灵活处理。比如在部署脚本中,你可以判断某个服务是否运行,如果没运行就自动启动。
函数封装:让代码更模块化
随着脚本变长,你会希望把重复的功能提取出来,变成“函数”。就像把工具打包成一个模块,用的时候直接调用。
#!/bin/bash
function print_welcome() {
echo "👋 欢迎使用自动化工具!"
echo "当前时间:$(date)"
}
print_welcome
你甚至可以传参给函数:
function greet_user() {
local name="$1" # $1 是第一个参数
local age="$2" # $2 是第二个参数
echo "你好,$name!你今年 $age 岁了。"
}
greet_user "小红" 22
🔍 注意:
local关键字表示变量是局部的,避免污染全局环境。
函数让脚本更清晰、可维护性更强。比如你有多个备份任务,可以封装成 backup_db()、backup_files() 这样的函数,调用起来一目了然。
实战案例:一个自动备份脚本
我们来写一个完整的 Shell Script 实战项目:每日自动备份指定目录。
#!/bin/bash
SOURCE_DIR="/home/user/project"
BACKUP_DIR="/backup/daily"
REMOTE_SERVER="backup@192.168.1.100"
REMOTE_PATH="/backups/project"
mkdir -p "$BACKUP_DIR"
TIMESTAMP=$(date "+%Y%m%d_%H%M%S")
tar -czf "$BACKUP_DIR/project_$TIMESTAMP.tar.gz" "$SOURCE_DIR"
if [ $? -eq 0 ]; then
echo "✅ 压缩成功,文件:project_$TIMESTAMP.tar.gz"
else
echo "❌ 压缩失败!"
exit 1
fi
rsync -avz "$BACKUP_DIR/project_$TIMESTAMP.tar.gz" "$REMOTE_SERVER:$REMOTE_PATH/"
if [ $? -eq 0 ]; then
echo "✅ 备份已同步到远程服务器"
else
echo "❌ 同步失败,请检查网络或权限"
exit 1
fi
find "$BACKUP_DIR" -name "project_*.tar.gz" -mtime +7 -delete
echo "🧹 已清理超过 7 天的旧备份"
echo "$(date): 备份任务完成" >> /var/log/backup.log
这个脚本包含:
- 变量配置,便于修改;
- 条件判断,确保每步成功才继续;
- 命令替换,获取时间戳;
- 函数封装(可扩展);
- 日志记录,方便排查问题。
你只需把这个脚本保存为 daily_backup.sh,然后通过 crontab 设置定时任务,让它每天凌晨自动运行。
结语:Shell Script 是开发者的“隐形生产力工具”
Shell Script 看似简单,实则威力无穷。它不是“高级语言”,却能在系统管理、部署、自动化测试等场景中发挥巨大作用。无论是运维工程师,还是前端、后端开发者,掌握它都能显著提升效率。
不要因为“它看起来像命令行”就轻视它。当你能把重复操作变成一键执行,当你能用脚本自动处理日志、备份、部署,你会真正体会到“自动化”的力量。
从今天开始,别再手动敲命令了。写一个脚本,让机器为你工作。你写下的每一行代码,都是在为未来的自己节省时间。
Shell Script 不只是技术,更是一种思维——把重复劳动变成可复用的智能流程。这也是为什么,无论技术如何演进,它依然在开发者世界中熠熠生辉。