简介
欢迎你,未来的系统管理员!你刚加入一家繁忙的科技公司,担任初级 DevOps 工程师。你的资深同事正在享受应得的假期,而一项紧急任务刚刚落到你的桌面上。主应用服务器正在生成大量日志文件,并且这些文件很快就要占满磁盘空间。你的任务是成为 脚本工匠。
你需要创建一个自动管理这些日志文件的 Shell 脚本。这不仅是运行几条命令,还要构建一个可靠且可重复使用的工具。你将从一个简单脚本开始,逐步加入变量、用户输入、错误检查和循环等功能。完成本次挑战后,你将编写出一个能够备份和管理文件的脚本,既能证明自己的能力,也能帮助团队解决问题!
开始编写脚本吧!
- 完成 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 工程师或系统管理员成长道路上的重要一步。你在这里练习的技能,是编写更复杂自动化脚本的基础。这些脚本可以管理服务器、部署应用程序和处理数据。你已经证明自己能够承担责任并交付可用的解决方案。做得很好!



