跳转到内容

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/passwd

1.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.txt

1.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/backup

1.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.txt

2. 文件操作最佳实践

2.1 检查文件是否存在

bash
#!/bin/bash
# 检查文件是否存在
file="config.ini"

if [ -f "$file" ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi

2.2 检查文件是否可读

bash
#!/bin/bash
# 检查文件是否可读
file="config.ini"

if [ -r "$file" ]; then
    echo "文件可读"
else
    echo "文件不可读"
fi

2.3 检查文件是否可写

bash
#!/bin/bash
# 检查文件是否可写
file="config.ini"

if [ -w "$file" ]; then
    echo "文件可写"
else
    echo "文件不可写"
fi

2.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 "取消删除"
fi

3. 完整示例

示例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(基础)

创建一个脚本,要求:

  1. 创建一个文本文件
  2. 写入多行内容
  3. 读取文件内容
  4. 输出文件行数

练习2(进阶)

创建一个脚本,要求:

  1. 读取一个配置文件
  2. 解析配置项
  3. 输出配置项

练习3(拓展)

创建一个脚本,要求:

  1. 遍历当前目录的所有.log文件
  2. 统计每个文件的行数
  3. 统计每个文件的ERROR数量
  4. 输出统计信息到CSV文件

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径