2026年03月27日-Linux Shell脚本编程 Linux Shell脚本编程实战 Shell脚本是Linux系统管理和自动化运维的利器。掌握Shell编程,能够显著提升工作效率,实现复杂任务的自动化处理。 基础语法规范 Shebang声明:脚本第一行指定解释器 变量定义与使用: 命令替换:将命令输出赋值给变量 条件判断与流程控制 if条件语句: case语句: for循环: while循环: 函数与模块化 函数定义: 参数处理 位置参数: getopts处理选项: 文本处理三剑客 grep:文本搜索 sed:流编辑器 awk:文本分析工具 实用脚本案例 日志分析脚本: 批量文件重命名: 系统监控脚本: 最佳实践 使用set -euo
Shell脚本是Linux系统管理和自动化运维的利器。掌握Shell编程,能够显著提升工作效率,实现复杂任务的自动化处理。
Shebang声明:脚本第一行指定解释器
#!/bin/bash # 或者 #!/usr/bin/env bash
变量定义与使用:
# 变量赋值(等号两边无空格) name="张三" age=25 # 使用变量(推荐用花括号) echo "姓名:${name}, 年龄:${age}" # 只读变量 readonly PI=3.14159 # 删除变量 unset name
命令替换:将命令输出赋值给变量
# 反引号方式(旧式) files_count=`ls -l | wc -l` # $()方式(推荐,支持嵌套) files_count=$(ls -l | wc -l) current_date=$(date +%Y-%m-%d)
if条件语句:
#!/bin/bash score=85 if [ $score -ge 90 ]; then echo "优秀" elif [ $score -ge 60 ]; then echo "及格" else echo "不及格" fi # 文件测试 if [ -f "/etc/passwd" ]; then echo "文件存在" fi # 逻辑运算 if [ -f "$file" ] && [ -r "$file" ]; then echo "文件存在且可读" fi
case语句:
#!/bin/bash action=$1 case "$action" in start) echo "启动服务" ;; stop) echo "停止服务" ;; restart|reload) echo "重启服务" ;; *) echo "用法: $0 {start|stop|restart}" exit 1 ;; esac
for循环:
# 遍历列表 for fruit in apple banana orange; do echo "水果:$fruit" done # 遍历文件 for file in *.txt; do echo "处理文件:$file" done # C风格循环 for ((i=1; i<=10; i++)); do echo "数字:$i" done
while循环:
# 读取文件行 while IFS= read -r line; do echo "$line" done < file.txt # 条件循环 count=0 while [ $count -lt 5 ]; do echo "计数:$count" count=$((count + 1)) done
函数定义:
#!/bin/bash # 函数定义 log_info() { local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[INFO] [$timestamp] $1" } log_error() { local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[ERROR] [$timestamp] $1" >&2 } # 调用函数 log_info "脚本开始执行" # 返回值 check_file() { if [ -f "$1" ]; then return 0 # 成功 else return 1 # 失败 fi } if check_file "/etc/passwd"; then echo "文件检查通过" fi
位置参数:
#!/bin/bash # $0 脚本名称 # $1 第一个参数 # $2 第二个参数 # $@ 所有参数(作为独立字符串) # $* 所有参数(作为单个字符串) # $# 参数个数 echo "脚本名称:$0" echo "参数个数:$#" echo "所有参数:$@" # 遍历参数 for arg in "$@"; do echo "参数:$arg" done
getopts处理选项:
#!/bin/bash while getopts "a:b:h" opt; do case $opt in a) echo "选项a,参数:$OPTARG" ;; b) echo "选项b,参数:$OPTARG" ;; h) echo "用法: $0 [-a value] [-b value] [-h]" exit 0 ;; \?) echo "无效选项: -$OPTARG" exit 1 ;; esac done
grep:文本搜索
# 搜索关键词 grep "error" /var/log/syslog # 递归搜索 grep -r "TODO" ./src # 正则表达式 grep -E "^[0-9]+$" numbers.txt # 统计匹配行数 grep -c "root" /etc/passwd
sed:流编辑器
# 替换文本 sed 's/old/new/g' file.txt # 删除行 sed '/pattern/d' file.txt # 打印指定行 sed -n '10,20p' file.txt # 直接修改文件 sed -i 's/foo/bar/g' file.txt
awk:文本分析工具
# 打印指定列 awk '{print $1, $3}' file.txt # 按条件过滤 awk '$3 > 100 {print $0}' file.txt # 统计 awk '{sum+=$1} END {print sum}' numbers.txt # 格式化输出 awk '{printf "%-10s %8d\n", $1, $2}' file.txt
日志分析脚本:
#!/bin/bash LOG_FILE="/var/log/nginx/access.log" echo "=== 访问统计 ===" echo "总访问量:$(wc -l < $LOG_FILE)" echo "独立IP数:$(awk '{print $1}' $LOG_FILE | sort -u | wc -l)" echo "" echo "=== 访问量前10的IP ===" awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | head -10
批量文件重命名:
#!/bin/bash counter=1 for file in *.jpg; do printf -v new_name "image_%04d.jpg" "$counter" mv "$file" "$new_name" ((counter++)) done
系统监控脚本:
#!/bin/bash while true; do cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}') mem_usage=$(free | grep Mem | awk '{printf("%.2f"), $3/$2 * 100.0}') echo "$(date '+%Y-%m-%d %H:%M:%S') CPU: ${cpu_usage}% MEM: ${mem_usage}%" sleep 5 done
Shell脚本是运维自动化的基础技能,结合其他工具(如Ansible、Jenkins)可以构建强大的自动化运维体系。不断积累常用脚本片段,形成个人工具库,能极大提升工作效率。