本文提供了一套系统的 Linux Shell 脚本编程教程,从基础概念到高级实战,涵盖环境变量、流程控制、函数应用和实际案例,协助读者快速掌握自动化运维的核心技能。
一、Shell 基础入门
1.1 Shell 是什么?
Shell 是一个命令行解释器,它接收用户输入的命令并将其转换为系统操作。通过编写 Shell 脚本,我们可以将多个命令组合在一起,实现自动化任务,提高工作效率。常见的 Shell 包括 Bash、Zsh、Ksh 等,其中 Bash 是 Linux 系统默认的 Shell。
1.2 第一个 Shell 脚本:Hello World
创建一个简单的脚本文件并执行:
#!/bin/bash
# 这是一个注释行
echo "Hello World"
保存为 hello.sh 后,需要添加执行权限:
chmod +x hello.sh
./hello.sh
输出结果:
Hello World
二、Shell 变量详解
2.1 变量定义与使用
Shell 变量无需声明类型,直接赋值即可:
name="Linux"
version="7.0"
echo "System: $name $version"
重大规则:
- 变量名只能包含字母、数字和下划线
- 不能以数字开头
- 等号两边不能有空格
2.2 环境变量
系统预定义的环境变量:
echo "User: $USER"
echo "Home: $HOME"
echo "Path: $PATH"
echo "Current: $PWD"
2.3 特殊变量
用于脚本参数处理:
echo "脚本名: $0"
echo "第一个参数: $1"
echo "参数个数: $#"
echo "所有参数: $*"
echo "上条命令结果: $?"
三、流程控制语句
3.1 条件判断(if语句)
基本语法结构:
if [ condition ]; then
commands
elif [ condition ]; then
commands
else
commands
fi
实际示例:检查文件是否存在
#!/bin/bash
file="/etc/passwd"
if [ -f "$file" ]; then
echo "$file 存在"
else
echo "$file 不存在"
fi
3.2 循环处理
for循环
遍历列表中的元素:
for i in 1 2 3 4 5
do
echo "Number: $i"
done
遍历文件内容:
for file in $(ls *.txt)
do
echo "Processing: $file"
done
while循环
读取文件内容:
while read line
do
echo "Line: $line"
done < /etc/passwd
计数器示例:
count=1
while [ $count -le 5 ]
do
echo "Count: $count"
count=$((count+1))
done
3.3 case语句
多分支选择结构:
echo "选择操作:"
echo "1) 重启服务"
echo "2) 停止服务"
echo "3) 查看状态"
read choice
case $choice in
1) systemctl restart sshd ;;
2) systemctl stop sshd ;;
3) systemctl status sshd ;;
*) echo "无效选择" ;;
esac
四、函数与数组
4.1 函数定义与调用
定义和调用函数:
# 定义函数
say_hello() {
echo "Hello, $1!"
}
# 调用函数
say_hello "World"
带返回值的函数:
add() {
result=$(( $1 + $2 ))
return $result
}
add 5 3
echo "结果: $?"
4.2 数组操作
创建和访问数组:
# 定义数组
fruits=("apple" "banana" "cherry")
# 访问元素
echo "第一个水果: ${fruits[0]}"
# 遍历数组
for fruit in "${fruits[@]}"
do
echo "水果: $fruit"
done
# 数组长度
echo "数组长度: ${#fruits[@]}"
五、实战案例集锦
5.1 系统监控脚本
实时监控系统资源:
#!/bin/bash
# 系统监控脚本
while true
do
clear
echo "===== 系统监控 ====="
echo "CPU使用率: $(top -bn1 | grep load | awk '{printf "%.2f%%
", $(NF-2)}')"
echo "内存使用: $(free -m | awk '/Mem/{printf "%.2f%%
", $3/$2 * 100}')"
echo "磁盘使用: $(df -h / | awk '///{print $(NF-1)}')"
echo "运行时间: $(uptime | awk '{print $3}' | tr -d ',')"
sleep 2
done
5.2 日志分析脚本
分析Apache访问日志:
#!/bin/bash
# 日志分析脚本
log_file="/var/log/apache2/access.log"
echo "===== Apache访问分析 ====="
echo "总访问次数: $(wc -l < $log_file)"
echo "独立IP数量: $(awk '{print $1}' $log_file | sort -u | wc -l)"
echo "最频繁访问IP:"
awk '{print $1}' $log_file | sort | uniq -c | sort -nr | head -5
echo "最热门页面:"
awk '{print $7}' $log_file | sort | uniq -c | sort -nr | head -5
5.3 自动备份脚本
目录备份与压缩:
#!/bin/bash
# 自动备份脚本
backup_dir="/home/user/backup"
source_dir="/home/user/documents"
date=$(date +%Y%m%d_%H%M%S)
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
fi
tar -czf "$backup_dir/backup_$date.tar.gz" "$source_dir"
if [ $? -eq 0 ]; then
echo "备份成功: $backup_dir/backup_$date.tar.gz"
else
echo "备份失败!"
fi
# 删除7天前的备份
find "$backup_dir" -name "*.tar.gz" -mtime +7 -delete
5.4 服务监控脚本
监控关键服务状态:
#!/bin/bash
# 服务监控脚本
services=("nginx" "mysql" "apache2")
for service in "${services[@]}"
do
if systemctl is-active --quiet "$service"; then
echo "$service: 运行中 ✓"
else
echo "$service: 未运行 ✗"
systemctl start "$service"
echo "已尝试启动 $service"
fi
done
六、高级技巧与最佳实践
6.1 错误处理
使用set命令进行错误控制:
# 遇到错误立即退出
set -e
# 显示执行命令
set -x
# 使用trap捕获信号
trap 'echo "脚本被中断"; exit 1' INT TERM
6.2 性能优化
优化脚本执行效率:
# 使用内置命令取代外部命令
# 慢: ls | grep pattern
# 快: echo pattern*
# 减少管道使用
# 慢: cat file | grep pattern
# 快: grep pattern file
# 使用awk进行复杂文本处理
awk '/pattern/{print $1}' file.txt
6.3 安全思考
编写安全脚本的提议:
# 总是检查变量是否设置
: ${USERNAME:?"请设置USERNAME变量"}
# 验证输入参数
if [ $# -lt 1 ]; then
echo "用法: $0 filename"
exit 1
fi
# 使用引号防止空格问题
if [ -f "$filename" ]; then
echo "文件存在"
fi
七、学习资源与下一步
7.1 推荐资源
- 官方文档: GNU Bash手册
- 在线教程: Linux Documentation Project
- 书籍: 《Linux命令行与Shell脚本编程大全》
7.2 进阶方向
- 正则表达式:模式匹配与文本处理
- sed和awk:高级文本处理工具
- 调试技巧:使用set -x和调试工具
- 性能优化:脚本效率提升方法
通过掌握这些Shell脚本编程技能,您将能够自动化日常任务,提高工作效率,并为进一步学习系统管理和DevOps打下坚实基础。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
转
收藏了,感谢分享