2026年01月21日/ 浏览 7
本文提供了一套系统的 Linux Shell 脚本编程教程,从基础概念到高级实战,涵盖环境变量、流程控制、函数应用和实际案例,帮助读者快速掌握自动化运维的核心技能。
Shell 是一个命令行解释器,它接收用户输入的命令并将其转换为系统操作。通过编写 Shell 脚本,我们可以将多个命令组合在一起,实现自动化任务,提高工作效率。常见的 Shell 包括 Bash、Zsh、Ksh 等,其中 Bash 是 Linux 系统默认的 Shell。
创建一个简单的脚本文件并执行:
#!/bin/bash # 这是一个注释行 echo "Hello World"保存为 hello.sh 后,需要添加执行权限:
chmod +x hello.sh ./hello.sh输出结果:
Hello WorldShell 变量无需声明类型,直接赋值即可:
name="Linux" version="7.0" echo "System: $name $version"重要规则:
变量名只能包含字母、数字和下划线不能以数字开头等号两边不能有空格系统预定义的环境变量:
echo "User: $USER" echo "Home: $HOME" echo "Path: $PATH" echo "Current: $PWD"用于脚本参数处理:
echo "脚本名: $0" echo "第一个参数: $1" echo "参数个数: $#" echo "所有参数: $*" echo "上条命令结果: $?"基本语法结构:
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遍历列表中的元素:
for i in 1 2 3 4 5 do echo "Number: $i" done遍历文件内容:
for file in $(ls *.txt) do echo "Processing: $file" done读取文件内容:
while read line do echo "Line: $line" done < /etc/passwd计数器示例:
count=1 while [ $count -le 5 ] do echo "Count: $count" count=$((count+1)) done多分支选择结构:
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定义和调用函数:
# 定义函数 say_hello() { echo "Hello, $1!" } # 调用函数 say_hello "World"带返回值的函数:
add() { result=$(( $1 + $2 )) return $result } add 5 3 echo "结果: $?"创建和访问数组:
# 定义数组 fruits=("apple" "banana" "cherry") # 访问元素 echo "第一个水果: ${fruits[0]}" # 遍历数组 for fruit in "${fruits[@]}" do echo "水果: $fruit" done # 数组长度 echo "数组长度: ${#fruits[@]}"实时监控系统资源:
#!/bin/bash # 系统监控脚本 while true do clear echo "===== 系统监控 =====" echo "CPU使用率: $(top -bn1 | grep load | awk {printf "%.2f%%\n", $(NF-2)})" echo "内存使用: $(free -m | awk /Mem/{printf "%.2f%%\n", $3/$2 * 100})" echo "磁盘使用: $(df -h / | awk /\//{print $(NF-1)})" echo "运行时间: $(uptime | awk {print $3} | tr -d ,)" sleep 2 done分析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目录备份与压缩:
#!/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监控关键服务状态:
#!/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使用set命令进行错误控制:
# 遇到错误立即退出 set -e # 显示执行命令 set -x # 使用trap捕获信号 trap echo "脚本被中断"; exit 1 INT TERM优化脚本执行效率:
# 使用内置命令代替外部命令 # 慢: ls | grep pattern # 快: echo pattern* # 减少管道使用 # 慢: cat file | grep pattern # 快: grep pattern file # 使用awk进行复杂文本处理 awk /pattern/{print $1} file.txt编写安全脚本的建议:
# 总是检查变量是否设置 : ${USERNAME:?"请设置USERNAME变量"} # 验证输入参数 if [ $# -lt 1 ]; then echo "用法: $0 filename" exit 1 fi # 使用引号防止空格问题 if [ -f "$filename" ]; then echo "文件存在" fi通过掌握这些Shell脚本编程技能,您将能够自动化日常任务,提高工作效率,并为进一步学习系统管理和DevOps打下坚实基础。