shell脚本(深入浅出)

什么是 shell脚本?从命令行到自动化小助手

你有没有在终端里反复输入相同的命令?比如每天早上都要 cd /home/user/project 然后 git pullnpm run dev?如果每次都要手动敲一遍,不仅费时,还容易出错。这时候,shell脚本就像一个“自动化小助手”,帮你把重复操作打包成一条命令,一键执行。

Shell 脚本的本质是一组按顺序执行的命令集合,通常保存为 .sh 文件,由 shell 解释器(如 Bash)来运行。它就像是给终端写的一份“操作说明书”,你只需说“执行这份说明书”,它就会自动完成所有步骤。

想象一下,你家的智能音箱能听懂“打开灯”、“播放音乐”这些指令。shell脚本就是给你的电脑终端“训练”出一套类似的指令系统,让你用简单的语言控制复杂流程。


如何编写第一个 shell脚本?

我们从最简单的例子开始。打开你喜欢的文本编辑器(比如 VS Code、vim 或 nano),新建一个文件,命名为 hello.sh

#!/bin/bash

echo "你好,世界!"

保存后,打开终端,进入该文件所在的目录,执行以下命令:

chmod +x hello.sh

./hello.sh

💡 小贴士:chmod +x 是 Linux 系统中设置文件权限的重要命令。没有这个权限,系统会拒绝执行脚本。


变量使用:让脚本记住信息

变量就像一个“小盒子”,可以存放数据。在 shell脚本中,变量的定义非常简单:

#!/bin/bash

name="张三"
age=25
city="北京"

echo "我叫 $name,今年 $age 岁,住在 $city。"

运行结果:

我叫 张三,今年 25 岁,住在 北京。

变量命名规范

  • 变量名只能包含字母、数字和下划线
  • 不能以数字开头
  • 推荐使用小写字母加下划线,如 user_namemax_retry

⚠️ 重要提醒:在 shell 中,变量赋值时等号两边不能有空格,否则会被当作命令解析,导致错误。


条件判断:让脚本学会“思考”

现实生活中,我们做决定常常需要判断条件。比如“如果下雨就带伞”。shell脚本也能实现类似逻辑。

#!/bin/bash

weather="下雨"

if [ "$weather" = "下雨" ]; then
    echo "记得带伞!"
elif [ "$weather" = "多云" ]; then
    echo "可以带伞,但不是必须。"
else
    echo "今天天气晴朗,不用带伞。"
fi

常见的条件判断符号

操作符 含义 示例
= 字符串相等 [ "$a" = "hello" ]
!= 字符串不相等 [ "$a" != "world" ]
-eq 数值相等 [ $num -eq 10 ]
-ne 数值不相等 [ $num -ne 5 ]
-lt 小于 [ $num -lt 100 ]
-gt 大于 [ $num -gt 50 ]

💡 提示:在判断数值时,必须使用 -eq-lt 等专用符号,不能用 =,否则会出错。


循环结构:重复执行任务的利器

当你需要对一组文件、数字或列表做相同操作时,循环就派上用场了。常见的有两种:for 循环和 while 循环。

for 循环:遍历列表

#!/bin/bash

fruits=("苹果" "香蕉" "橙子" "葡萄")

for fruit in "${fruits[@]}"; do
    echo "我喜欢吃 $fruit。"
done

输出:

我喜欢吃 苹果。
我喜欢吃 香蕉。
我喜欢吃 橙子。
我喜欢吃 葡萄。

while 循环:条件满足就继续

#!/bin/bash

count=1

while [ $count -le 5 ]; do
    echo "这是第 $count 次循环"
    count=$((count + 1))
    # 使用 $(( )) 进行算术运算
done

输出:

这是第 1 次循环
这是第 2 次循环
这是第 3 次循环
这是第 4 次循环
这是第 5 次循环

函数封装:模块化你的脚本逻辑

随着脚本变长,把重复功能封装成函数,能让代码更清晰、更易维护。就像把厨房里的工具分类存放,用的时候拿取方便。

#!/bin/bash

greet() {
    local name="$1"
    # local 表示局部变量,只在函数内有效
    echo "欢迎,$name!今天过得怎么样?"
}

greet "李四"
greet "王五"

输出:

欢迎,李四!今天过得怎么样?
欢迎,王五!今天过得怎么样?

✅ 函数的优势:

  • 代码复用性强
  • 逻辑清晰,便于调试
  • 支持参数传递,灵活度高

实战案例:自动备份脚本

现在我们来写一个实用的 shell脚本:每天自动备份指定目录到指定位置。

#!/bin/bash

SOURCE_DIR="/home/user/data"
BACKUP_DIR="/home/user/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.tar.gz"

if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    echo "创建备份目录:$BACKUP_DIR"
fi

tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$SOURCE_DIR" .

if [ $? -eq 0 ]; then
    echo "✅ 备份成功:$BACKUP_DIR/$BACKUP_FILE"
else
    echo "❌ 备份失败,请检查权限或路径。"
fi

将此脚本保存为 backup.sh,赋予执行权限后运行,即可完成一次完整备份。

📌 建议:你可以使用 cron 定时任务每天凌晨自动执行该脚本,实现真正的自动化备份。


总结:shell脚本的价值与进阶建议

shell脚本虽然看似简单,却是运维、开发和系统管理中不可或缺的工具。它能帮你:

  • 自动化重复任务
  • 简化复杂操作流程
  • 快速响应日常运维需求
  • 提升工作效率,减少人为错误

掌握 shell脚本,就像学会了给电脑下达“智能指令”。从最基础的变量、条件、循环,到函数封装和实际项目应用,每一步都值得深入实践。

📝 最后建议:不要只看不练。每天写一个小程序,比如“统计日志行数”、“清理临时文件”、“批量重命名文件”,逐步积累经验。当你能用几行脚本解决一个繁琐问题时,那种成就感,真的值得。

shell脚本不是高深莫测的黑科技,而是每个开发者都应该掌握的“基础技能”。它不炫技,但极实用。从今天开始,动手写第一个脚本吧。