shell script(深入浅出)

什么是 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_dirbackup_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 不只是技术,更是一种思维——把重复劳动变成可复用的智能流程。这也是为什么,无论技术如何演进,它依然在开发者世界中熠熠生辉。