Shell 编程的高级技巧和实战应用
第一步:高级函数和模块化设计
1.1 高级函数设计
- 探讨函数的参数处理和默认值设置。
- 示例:实现一个可以处理可选参数的函数。
#!/bin/bashgreet() {local name=${1:-"World"} # 如果没有提供参数,使用默认值 "World"echo "Hello, $name!"
}greet # 输出 "Hello, World!"
greet "Alice" # 输出 "Hello, Alice!"
输出:
Hello, World!
Hello, Alice!
1.2 模块化脚本设计
- 介绍如何将脚本拆分为多个模块,并通过
source
命令加载。 - 示例:创建一个包含多个函数的模块化脚本。
# utils.sh
#!/bin/bashadd() {echo $(( $1 + $2 ))
}subtract() {echo $(( $1 - $2 ))
}
# main.sh
#!/bin/bashsource ./utils.shsum=$(add 5 3)
diff=$(subtract 5 3)echo "Sum: $sum"
echo "Difference: $diff"
输出:
Sum: 8
Difference: 2
第二步:高级文本处理
2.1 深入学习 sed
- 介绍
sed
的高级用法,如批量替换、插入和删除。 - 示例:使用
sed
实现批量替换和插入操作。
#!/bin/bashtext="Hello, World! This is a sample text."
echo "$text" | sed 's/World/Shell/g' # 批量替换# 创建文件并插入新行
echo "$text" > sample.txt
sed -i '1iThis is a new line at the beginning.' sample.txt
cat sample.txt
输出:
Hello, Shell! This is a sample text.
This is a new line at the beginning.
Hello, World! This is a sample text.
2.2 高级 awk 用法
- 探讨
awk
的高级功能,如字段处理、条件处理和函数。 - 示例:使用
awk
处理复杂的文本数据。
#!/bin/bash# 创建一个包含多行数据的文件
cat <<EOF > data.txt
Name Age
Alice 30
Bob 25
Charlie 35
EOF# 使用 awk 处理数据
awk 'NR > 1 { print $1, $2 + 1 }' data.txt
输出:
Alice 31
Bob 26
Charlie 36
第三步:性能优化和资源管理
3.1 高效的文件处理
- 介绍如何通过并行处理和批量操作提高文件处理效率。
- 示例:使用
xargs
实现并行文件处理。
#!/bin/bash# 创建多个样本文件
for i in {1..5}; doecho "Sample content $i" > file$i.txt
done# 使用 xargs 并行处理文件
ls *.txt | xargs -n 1 -P 5 -I {} sh -c 'cat {} && echo "Processed {}"'
输出:
Sample content 1
Processed file1.txt
Sample content 2
Processed file2.txt
Sample content 3
Processed file3.txt
Sample content 4
Processed file4.txt
Sample content 5
Processed file5.txt
3.2 资源限制和监控
- 讨论如何在脚本中设置资源限制和监控系统资源使用情况。
- 示例:使用
ulimit
设置资源限制并监控资源使用。
#!/bin/bash# 限制单个进程的最大文件数
ulimit -n 1024# 创建大量文件测试限制
for i in {1..1024}; dotouch file$i
done# 监控系统资源使用
echo "Memory usage:"
free -mecho "Disk usage:"
df -h
输出:
Memory usage:total used free shared buff/cache available
Mem: 7977 518 6349 9 1109 7114
Swap: 2047 0 2047Disk usage:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 10G 37G 22% /
第四步:综合实战案例
4.1 自动化备份和恢复
- 创建一个自动化备份和恢复脚本,演示如何处理压缩和解压缩、远程传输等操作。
#!/bin/bash# 自动化备份脚本
backup_dir="/backup"
src_dir="/data"
date=$(date +%F)
backup_file="$backup_dir/$date.tar.gz"# 创建备份
mkdir -p "$backup_dir"
tar -czf "$backup_file" "$src_dir"
echo "Backup completed: $backup_file"# 自动化恢复脚本
restore_dir="/restore"
mkdir -p "$restore_dir"
tar -xzf "$backup_file" -C "$restore_dir"
echo "Restore completed: $restore_dir"
输出:
Backup completed: /backup/2023-07-17.tar.gz
Restore completed: /restore
4.2 日志分析和报警
- 编写一个脚本自动分析系统日志,并在检测到错误时发送邮件或报警。
#!/bin/bashlog_file="/var/log/syslog"
output_file="/var/log/error_report.txt"# 分析日志并生成报告
grep "ERROR" "$log_file" > "$output_file"
echo "Error report generated: $output_file"# 发送邮件(需要配置 mail 命令)
mail -s "Error Report" admin@example.com < "$output_file"
echo "Error report sent to admin@example.com"
输出:
Error report generated: /var/log/error_report.txt
Error report sent to admin@example.com