Shell 编程综合案例
Shell 编程是一种在类 Unix 操作系统上进行脚本编写的方式,可以用于自动化任务、处理文件、监控系统等。下面我将为您提供一个综合的 Shell 编程案例,涵盖文件操作、条件判断、循环、函数等常见用法。
案例需求
假设我们需要编写一个 Shell 脚本来完成以下任务:
- 检查指定目录中是否存在某类型的文件(如
.log
文件)。 - 如果找到匹配的文件,统计文件的数量和总大小。
- 将文件名和大小输出到一个新的日志文件中。
- 提供压缩选项,将匹配的文件压缩并移动到一个备份目录中。
Shell 脚本实现
#!/bin/bash
# 定义变量
TARGET_DIR="./logs"
BACKUP_DIR="./backup"
LOG_FILE="summary.log"
FILE_TYPE="*.log"
# 检查目标目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
echo "目标目录 $TARGET_DIR 不存在。"
exit 1
fi
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
# 统计文件数量和大小
file_count=$(find "$TARGET_DIR" -type f -name "$FILE_TYPE" | wc -l)
total_size=$(find "$TARGET_DIR" -type f -name "$FILE_TYPE" -exec du -ch {} + | grep total$ | awk '{print $1}')
# 打印统计信息
echo "在目录 $TARGET_DIR 中找到 $file_count 个 $FILE_TYPE 文件,总大小为 $total_size 。"
# 将文件名和大小输出到日志文件
{
echo "文件摘要日志"
echo "日期: $(date)"
echo "所在目录: $TARGET_DIR"
echo "文件类型: $FILE_TYPE"
echo "文件数量: $file_count"
echo "总大小: $total_size"
echo ""
echo "文件明细:"
find "$TARGET_DIR" -type f -name "$FILE_TYPE" -exec ls -lh {} \;
} > "$LOG_FILE"
echo "文件明细已记录在 $LOG_FILE 。"
# 提供压缩选项
read -p "是否要将这些文件压缩并备份?(y/n): " choice
if [[ "$choice" == "y" || "$choice" == "Y" ]]; then
find "$TARGET_DIR" -type f -name "$FILE_TYPE" -exec tar -czf "$BACKUP_DIR/backup_$(date +%Y%m%d%H%M%S).tar.gz" {} +
echo "文件已压缩并移至 $BACKUP_DIR 。"
else
echo "文件未进行压缩。"
fi
解释
变量定义:脚本开始时定义了一些变量,指定了目标目录、备份目录、日志文件名和文件类型。
目录检查:使用
-d
来检查目标目录是否存在,如果不存在就退出脚本。文件统计:使用
find
命令查找符合条件的文件,并统计文件数量和大小。日志记录:将统计信息和文件详细信息写入日志文件,这里利用了多行写入的方式。
压缩选项:提供用户选择,是否压缩匹配的文件并存入备份目录。用
tar
命令实现压缩,并以当前时间为文件名的一部分。输入处理:使用
read
处理用户输入,并进行简单的条件判断。
这个案例展示了 Bash 脚本的一些基本功能,可以根据实际需要进行修改和扩展。通过练习,您可以熟练掌握更多有用的 Shell 编程技巧。