脚本工匠

ShellBeginner
立即练习

简介

欢迎你,未来的系统管理员!你刚加入一家繁忙的科技公司,担任初级 DevOps 工程师。你的资深同事正在享受应得的假期,而一项紧急任务刚刚落到你的桌面上。主应用服务器正在生成大量日志文件,并且这些文件很快就要占满磁盘空间。你的任务是成为 脚本工匠

你需要创建一个自动管理这些日志文件的 Shell 脚本。这不仅是运行几条命令,还要构建一个可靠且可重复使用的工具。你将从一个简单脚本开始,逐步加入变量、用户输入、错误检查和循环等功能。完成本次挑战后,你将编写出一个能够备份和管理文件的脚本,既能证明自己的能力,也能帮助团队解决问题!

开始编写脚本吧!

重要提示
本挑战涉及的技能超出了 Quick Start with Linux 的范围。如果你还没有学习这些主题,请暂时跳过本挑战,继续学习 Linux for Noobs,这是 Linux 学习路径中的下一门课程。
何时回来:
  1. 完成 Shell Scripting Fundamentals 指导实验后,再回来尝试本挑战。

编写简单的 Shell 脚本

你的第一个任务是打好基础。每个优秀的脚本都始于一行代码。你需要创建脚本文件并添加一条基本命令,以确认脚本能够正常工作。这个初始步骤可以验证环境配置是否正确,并确认你已经准备好构建更复杂的逻辑。

任务

  • ~/project 目录中创建名为 log_manager.sh 的新 Shell 脚本文件。
  • 在脚本最顶部添加「shebang」行(#!/bin/bash)。这行内容用于告诉系统使用哪个解释器。
  • 添加一条命令,将消息「Log Manager Initialized.」显示在屏幕上。
  • 使用 chmod +x 命令使脚本可执行。

要求

  • 脚本必须命名为 log_manager.sh
  • 脚本必须位于 ~/project 目录中。
  • 第一行必须是 #!/bin/bash
  • 脚本必须使用 echo 命令显示指定消息。
  • 脚本必须具有执行权限(使用 chmod +x log_manager.sh)。

示例

创建脚本并使其可执行后,完整流程应如下所示。

首先,确认脚本文件存在:

ls ~/project/
log_manager.sh

为脚本设置执行权限:

chmod +x ~/project/log_manager.sh

现在运行脚本:

./log_manager.sh

脚本应显示:

Log Manager Initialized.

你还可以检查脚本内容是否正确:

cat ~/project/log_manager.sh

文件内容应为:

#!/bin/bash

echo "Log Manager Initialized."

提示

  • 你可以使用 nano 等命令行文本编辑器创建和编辑文件。例如:nano log_manager.sh
  • echo 命令用于显示一行文本。
  • 使用 chmod +x filename 使脚本可执行。+x 会为文件所有者添加执行权限。

添加变量和用户输入

硬编码的脚本不够灵活。为了让脚本更加动态且可重复使用,现在引入变量。你将定义一个表示日志目录的变量,并提示用户输入一次备份运行标签。这样,无需修改代码本身,脚本就能适应不同情况。

任务

  • 修改 log_manager.sh 脚本。
  • 定义名为 LOG_DIR 的变量,并将其设置为路径 /home/labex/project/app_logs
  • 添加一行,显示「Enter the backup filename: 」,提示用户输入内容。
  • 使用 read 命令将用户输入保存到名为 BACKUP_FILENAME 的新变量中。
  • 添加最后一条 echo 命令确认设置,显示类似「Backing up logs to: [filename]」的消息,其中 [filename] 是用户输入的值。

要求

  • 脚本必须包含变量 LOG_DIR,其值为 /home/labex/project/app_logs
  • 脚本必须使用 read 命令获取用户输入。
  • 用户输入必须保存到名为 BACKUP_FILENAME 的变量中。
  • 最终输出必须使用 $BACKUP_FILENAME 变量。

示例

运行修改后的脚本时,脚本应提示用户输入,并显示确认消息。交互过程应如下所示:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup

脚本应在「Enter the backup filename:」提示处暂停,等待你输入名称并按下回车键。收到输入后,脚本会使用输入的值显示确认消息。在本挑战中,该值是输出中显示的一次运行标签;实际的备份操作会在步骤 4 中通过将 .log 文件复制到 ~/project/backups 来实现。

提示

  • 定义变量时使用 VARIABLE_NAME="value" 语法。等号(=)两侧不能有空格。
  • 要使用变量的值,请在变量名前加 $,例如 $MY_VARIABLE
  • read 命令会暂停脚本,等待你输入内容并按下回车键。

实现条件逻辑

优秀的脚本会预先考虑可能出现的问题。如果指定的日志目录不存在,会发生什么?脚本将无法正常运行。为了让脚本更加可靠,你需要添加条件逻辑。使用 if 语句检查日志目录是否存在,然后再执行任何操作。

任务

  • 修改 log_manager.sh 脚本。
  • 添加 if 语句,检查 $LOG_DIR 变量指定的目录是否存在。
  • 如果目录存在,脚本应像之前一样继续运行(提示输入文件名等)。
  • 如果目录不存在,脚本应显示错误消息「Error: Log directory not found.」,并立即以非零状态码退出。

要求

  • 脚本必须使用 if 语句。
  • 条件必须使用 -d 测试运算符检查目录是否存在。
  • 如果目录不存在,脚本必须使用 echo 输出指定的错误消息。
  • 如果目录不存在,脚本必须使用 exit 1 终止。

示例

当日志目录存在时,脚本应正常运行:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

如果日志目录不存在,脚本应显示错误并退出:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

在这种情况下,脚本会显示错误消息后立即终止,不会提示用户输入,也不会继续执行任何备份操作。

提示

  • 基本 if 语句的语法是 if [ condition ]; then ... else ... fi
  • 测试条件 [ -d "$DIRECTORY_PATH" ]:如果 $DIRECTORY_PATH 存在且是一个目录,则返回真。
  • exit 1 是表示脚本因错误终止的标准方式。

循环执行文件操作

现在开始实现自动化的核心功能!你需要处理日志目录中的文件。使用 for 循环遍历 app_logs 目录中所有以 .log 结尾的文件。在本挑战中,你只需将这些文件复制到新的备份目录。BACKUP_FILENAME 输入仍然只是输出中显示的一次运行标签,脚本不会使用它创建归档文件。

任务

  • 首先,在 ~/project 中创建名为 backups 的目录,用于存放复制的日志文件。
  • 修改 log_manager.sh 脚本。
  • if 代码块中(确认目录存在的位置)添加 for 循环。
  • 循环应遍历 $LOG_DIR 目录中所有以 .log 结尾的文件。
  • 在循环中使用 cp 命令,将每个日志文件复制到 ~/project/backups 目录。
  • 每复制一个文件,显示类似「Copied [filename]」的消息。

要求

  • 必须先在命令行中创建 ~/project/backups 目录。
  • 脚本必须使用 for 循环。
  • 循环必须遍历 $LOG_DIR 中匹配 *.log 模式的文件。
  • 必须在循环中使用 cp 命令,将文件复制到 ~/project/backups
  • 必须使用 echo 语句报告每个文件复制时的文件名。

示例

完成此步骤后,使用备份文件名运行脚本时,脚本应处理所有日志文件,并显示类似以下内容的输出:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

脚本应遍历目录中的每个 .log 文件,并为每个文件显示一条「Copied」消息。实际文件名取决于 app_logs 目录中存在的日志文件。

脚本完成后,可以检查 backups 目录,确认文件已复制:

ls ~/project/backups/
access.log  debug.log  error.log

提示

  • 使用 mkdir 命令创建目录。
  • 文件的 for 循环可以写成 for file in /path/to/*.log; do ... done
  • cp 命令的语法是 cp <source> <destination>
  • 每次循环时,循环变量(例如 file)都会保存文件的完整路径。

总结

恭喜你,脚本工匠!你已经从零开始成功构建了一个完整且可运行的 Shell 脚本。你处理了一个真实场景中的问题——管理日志文件,并通过自动化解决了它。

在本次挑战中,你掌握了 Shell 脚本编程的多个基础概念:

  • 使用 shebang 创建并组织脚本。
  • 使用变量让脚本更加动态。
  • 使用 read 获取用户输入。
  • 使用 if 语句实现可靠的错误检查。
  • 使用 for 循环自动执行重复任务。
  • 管理文件权限并运行脚本。

现在,你的脚本可以自动检查日志目录是否存在,处理所有日志文件,并将它们复制到备份位置。这是你作为 DevOps 工程师或系统管理员成长道路上的重要一步。你在这里练习的技能,是编写更复杂自动化脚本的基础。这些脚本可以管理服务器、部署应用程序和处理数据。你已经证明自己能够承担责任并交付可用的解决方案。做得很好!

✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习