主题
Shell文件操作
课程介绍
文件操作是Shell脚本编程的核心功能之一。本课程将详细讲解Shell中的文件操作,包括文件的读取、写入、追加、删除、权限管理等,帮助你掌握Shell脚本中的文件处理技巧。
1. 文件操作
1.1 读取文件
Shell提供了多种读取文件的方式。
示例1:逐行读取文件
bash
#!/bin/bash
# 逐行读取文件
while read line
do
echo "行:$line"
done < /etc/passwd示例2:读取整个文件
bash
#!/bin/bash
# 读取整个文件
content=$(cat /etc/passwd)
echo "$content"示例3:读取文件的前N行
bash
#!/bin/bash
# 读取文件的前10行
head -n 10 /etc/passwd示例4:读取文件的后N行
bash
#!/bin/bash
# 读取文件的后10行
tail -n 10 /etc/passwd1.2 写入文件
Shell提供了多种写入文件的方式。
示例1:覆盖写入文件
bash
#!/bin/bash
# 覆盖写入文件
echo "Hello, World!" > output.txt示例2:追加写入文件
bash
#!/bin/bash
# 追加写入文件
echo "Hello, World!" >> output.txt示例3:写入多行内容
bash
#!/bin/bash
# 写入多行内容
cat > output.txt << EOF
第一行
第二行
第三行
EOF示例4:使用printf写入文件
bash
#!/bin/bash
# 使用printf写入文件
printf "姓名:%s\n年龄:%d\n" "张三" 25 > output.txt1.3 删除文件
Shell提供了删除文件的方式。
示例1:删除单个文件
bash
#!/bin/bash
# 删除单个文件
rm file.txt示例2:删除多个文件
bash
#!/bin/bash
# 删除多个文件
rm file1.txt file2.txt file3.txt示例3:删除目录下的所有文件
bash
#!/bin/bash
# 删除目录下的所有文件
rm /data/*.txt示例4:递归删除目录
bash
#!/bin/bash
# 递归删除目录
rm -rf /data/backup1.4 文件权限操作
Shell提供了修改文件权限的方式。
示例1:修改文件权限
bash
#!/bin/bash
# 修改文件权限
chmod 755 script.sh示例2:修改文件所有者
bash
#!/bin/bash
# 修改文件所有者
chown user:group file.txt示例3:修改文件用户组
bash
#!/bin/bash
# 修改文件用户组
chgrp group file.txt2. 文件操作最佳实践
2.1 检查文件是否存在
bash
#!/bin/bash
# 检查文件是否存在
file="config.ini"
if [ -f "$file" ]; then
echo "文件存在"
else
echo "文件不存在"
fi2.2 检查文件是否可读
bash
#!/bin/bash
# 检查文件是否可读
file="config.ini"
if [ -r "$file" ]; then
echo "文件可读"
else
echo "文件不可读"
fi2.3 检查文件是否可写
bash
#!/bin/bash
# 检查文件是否可写
file="config.ini"
if [ -w "$file" ]; then
echo "文件可写"
else
echo "文件不可写"
fi2.4 安全删除文件
bash
#!/bin/bash
# 安全删除文件
file="important.txt"
# 确认删除
read -p "确定要删除文件 $file 吗?(y/n):" confirm
if [ "$confirm" = "y" ]; then
# 备份文件
cp "$file" "${file}.bak"
# 删除文件
rm "$file"
echo "文件已删除,备份文件:${file}.bak"
else
echo "取消删除"
fi3. 完整示例
示例1:配置文件解析
bash
#!/bin/bash
# 配置文件解析
# 配置文件
config_file="config.ini"
# 检查文件是否存在
if [ ! -f "$config_file" ]; then
echo "配置文件不存在:$config_file"
exit 1
fi
# 读取配置文件
while read line
do
# 跳过空行和注释行
if [[ -z "$line" || "$line" == \#* ]]; then
continue
fi
# 解析配置项
key=$(echo "$line" | cut -d'=' -f1)
value=$(echo "$line" | cut -d'=' -f2)
# 去除空格
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# 输出配置项
echo "配置项:$key = $value"
# 保存到变量
declare -g "$key=$value"
done < "$config_file"
# 使用配置项
echo "数据库地址:$db_host"
echo "数据库端口:$db_port"
echo "数据库用户:$db_user"示例2:批量处理文件
bash
#!/bin/bash
# 批量处理文件
# 遍历所有.log文件
for file in *.log
do
# 检查文件是否存在
if [ ! -f "$file" ]; then
continue
fi
# 统计行数
lines=$(wc -l < "$file")
# 统计ERROR数量
errors=$(grep -c "ERROR" "$file")
# 统计WARN数量
warns=$(grep -c "WARN" "$file")
# 输出统计信息
echo "文件:$file"
echo " 行数:$lines"
echo " ERROR数:$errors"
echo " WARN数:$warns"
echo ""
# 保存统计信息到文件
echo "$file,$lines,$errors,$warns" >> statistics.csv
done示例3:批量重命名文件
bash
#!/bin/bash
# 批量重命名文件
# 遍历所有.txt文件
for file in *.txt
do
# 检查文件是否存在
if [ ! -f "$file" ]; then
continue
fi
# 获取文件名(不含扩展名)
filename=$(basename "$file" .txt)
# 替换空格为下划线
new_filename=$(echo "$filename" | tr ' ' '_')
# 重命名文件
mv "$file" "${new_filename}.txt"
echo "重命名:$file -> ${new_filename}.txt"
done示例4:文件备份脚本
bash
#!/bin/bash
# 文件备份脚本
# 配置
SOURCE_DIR="/data/important"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_${DATE}.tar.gz"
# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
echo "源目录不存在:$SOURCE_DIR"
exit 1
fi
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 创建备份
tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" -C "$SOURCE_DIR" .
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功:${BACKUP_DIR}/${BACKUP_FILE}"
# 删除7天前的备份
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete
echo "已清理7天前的备份文件"
else
echo "备份失败"
exit 1
fi课程总结
这节课我们学习了Shell文件操作。
核心内容:
- 文件读取(逐行读取、读取整个文件、读取前后N行)
- 文件写入(覆盖写入、追加写入、多行写入)
- 文件删除(单个删除、批量删除、递归删除)
- 文件权限操作(chmod、chown、chgrp)
- 文件操作最佳实践(检查文件、安全删除)
- 完整示例(配置文件解析、批量处理、备份脚本)
重要命令:
cat:读取文件head:读取文件前N行tail:读取文件后N行echo:写入文件>:覆盖写入>>:追加写入rm:删除文件chmod:修改文件权限chown:修改文件所有者wc:统计文件行数
文件操作是Shell脚本编程的基础,掌握这些知识后,我们将在后续课程中学习正则表达式、文本处理等高级特性。
课后练习
练习1(基础)
创建一个脚本,要求:
- 创建一个文本文件
- 写入多行内容
- 读取文件内容
- 输出文件行数
练习2(进阶)
创建一个脚本,要求:
- 读取一个配置文件
- 解析配置项
- 输出配置项
练习3(拓展)
创建一个脚本,要求:
- 遍历当前目录的所有.log文件
- 统计每个文件的行数
- 统计每个文件的ERROR数量
- 输出统计信息到CSV文件