介绍
欢迎你,有抱负的系统管理员!你刚刚加入一家繁忙的科技公司,担任初级 DevOps 工程师。你的资深同事正在休假,而一项关键任务刚刚落到了你的肩上。主应用服务器正在生成大量的日志文件,它们很快就会耗尽磁盘空间。如果接受这项任务,你的使命就是成为一名脚本工匠。
你需要创建一个自动化 Shell 脚本来管理这些日志文件。这不仅仅是运行几个命令,而是要构建一个健壮且可复用的工具。你将从一个简单的脚本开始,逐步添加变量、用户输入、错误检查和循环等功能。在挑战结束时,你将完成一个能够备份和管理文件的脚本,向团队证明你的价值并解决燃眉之急!
让我们开始编写脚本吧!
- 暂时跳过该挑战,继续学习 Linux 学习路径 中的后续引导式实验。
- 与 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 工程师或系统管理员职业生涯中的重要一步。你在这里练习的技能是编写更复杂的自动化脚本的基础,这些脚本可以管理服务器、部署应用程序和处理数据。你已经证明了自己能够承担责任并交付可行的解决方案。干得好!



