脚本工匠

LinuxAdvanced
立即练习

介绍

欢迎你,有抱负的系统管理员!你刚刚加入一家繁忙的科技公司,担任初级 DevOps 工程师。你的资深同事正在休假,而一项关键任务刚刚落到了你的肩上。主应用服务器正在生成大量的日志文件,它们很快就会耗尽磁盘空间。如果接受这项任务,你的使命就是成为一名脚本工匠

你需要创建一个自动化 Shell 脚本来管理这些日志文件。这不仅仅是运行几个命令,而是要构建一个健壮且可复用的工具。你将从一个简单的脚本开始,逐步添加变量、用户输入、错误检查和循环等功能。在挑战结束时,你将完成一个能够备份和管理文件的脚本,向团队证明你的价值并解决燃眉之急!

让我们开始编写脚本吧!

重要提示
接下来的挑战内容可能会超出 Linux 快速入门 课程的范围。
如果在挑战过程中遇到困难:
  1. 暂时跳过该挑战,继续学习 Linux 学习路径 中的后续引导式实验。
  2. 与 Labby 讨论或查看解决方案。

编写简单的 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] 是用户输入的值。

要求

  • 脚本必须包含一个设置为 /home/labex/project/app_logs 的变量 LOG_DIR
  • 脚本必须使用 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 工程师或系统管理员职业生涯中的重要一步。你在这里练习的技能是编写更复杂的自动化脚本的基础,这些脚本可以管理服务器、部署应用程序和处理数据。你已经证明了自己能够承担责任并交付可行的解决方案。干得好!

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