Bash脚本实战:5个超实用的.sh文件编写技巧(附代码示例)

张开发
2026/4/16 15:20:34 15 分钟阅读

分享文章

Bash脚本实战:5个超实用的.sh文件编写技巧(附代码示例)
Bash脚本实战5个超实用的.sh文件编写技巧附代码示例在Linux系统管理中Bash脚本就像一把瑞士军刀能够将繁琐的重复操作转化为一键执行的自动化流程。无论是服务器维护、数据处理还是日常任务管理掌握.sh文件的编写技巧都能显著提升工作效率。本文将分享5个经过实战检验的高级技巧每个技巧都配有可直接复用的代码示例。1. 变量操作的进阶用法变量是Bash脚本的基石但大多数人只停留在基础赋值阶段。以下三个技巧能让你的变量操作更专业技巧1.1变量默认值设置# 如果USER未定义则使用guest作为默认值 current_user${USER:-guest} echo 当前用户: $current_user # 更安全的目录路径处理 backup_dir${BACKUP_DIR:-/var/backups} mkdir -p $backup_dir技巧1.2变量类型检测# 检测变量是否为数字 is_number() { [[ $1 ~ ^[0-9]$ ]] echo 是数字 || echo 非数字 } is_number 123 # 输出: 是数字 is_number abc # 输出: 非数字技巧1.3关联数组(字典)使用declare -A server_ports server_ports([web]80 [db]3306 [cache]6379) # 遍历关联数组 for service in ${!server_ports[]}; do echo $service 服务端口: ${server_ports[$service]} done2. 条件判断的优雅写法传统的if-else语句往往使脚本臃肿这些写法更简洁技巧2.1单行条件执行# 文件存在时才执行操作 [ -f /tmp/lock.file ] rm -f /tmp/lock.file # 目录不存在则创建 [ -d /data/logs ] || mkdir -p /data/logs技巧2.2多条件组合判断# 同时检查文件可读且非空 if [[ -r $config_file -s $config_file ]]; then source $config_file else echo 配置文件无效或不可读 2 exit 1 fi技巧2.3使用case语句处理多分支case $OSTYPE in linux*) echo Linux系统 ;; darwin*) echo MacOS系统 ;; cygwin*) echo Windows Cygwin ;; *) echo 未知系统: $OSTYPE ;; esac3. 循环处理的高效模式循环是自动化处理的核心这些技巧能提升循环效率技巧3.1并行处理加速# 使用xargs并行处理文件 find . -name *.log -print0 | xargs -0 -P 4 -I {} gzip {} # 并行执行命令 for host in web{1..5}; do ssh $host uptime done wait # 等待所有后台任务完成技巧3.2处理带空格的文件名# 安全处理包含特殊字符的文件名 while IFS read -r -d $\0 file; do echo 处理文件: $file done (find . -type f -print0)技巧3.3无限循环与退出控制# 带超时控制的监控循环 timeout300 # 5分钟 start_time$(date %s) while true; do # 检查超时 current_time$(date %s) if (( current_time - start_time timeout )); then echo 监控超时 2 break fi # 监控逻辑 if check_service_status; then echo 服务正常 break fi sleep 10 done4. 函数与模块化设计良好的函数设计能让脚本更易维护技巧4.1函数返回值处理# 返回数组的函数 get_users() { local users(admin guest operator) echo ${users[]} } # 接收返回的数组 user_array($(get_users)) echo 第一个用户: ${user_array[0]}技巧4.2错误处理与日志记录# 带错误处理的函数模板 safe_operation() { local log_file$1 { # 尝试执行操作 critical_command1 || return 1 critical_command2 || return 1 echo 操作成功完成 $(date) $log_file return 0 } 21 | tee -a $log_file }技巧4.3脚本参数解析# 专业的参数解析模板 while [[ $# -gt 0 ]]; do case $1 in -v|--verbose) verbose1 ;; -f|--file) shift; input_file$1 ;; --dry-run) dry_run1 ;; *) echo 未知参数: $1 2; exit 1 ;; esac shift done [[ -z $input_file ]] { echo 必须指定输入文件 2; exit 1; }5. 实用脚本片段集合这些即插即用的代码块能解决常见问题技巧5.1自动备份脚本#!/bin/bash # 带版本控制的自动备份 backup_dir/backups/$(date %Y%m%d) mkdir -p $backup_dir rsync -az --delete \ --link-dest/backups/$(date -d 1 day ago %Y%m%d) \ /data/ $backup_dir/data # 保留最近7天备份 find /backups -mindepth 1 -maxdepth 1 -type d -mtime 7 | xargs rm -rf技巧5.2日志分析助手#!/bin/bash # 分析Nginx日志获取访问TOP 10 log_file$1 [[ -f $log_file ]] || { echo 日志文件不存在; exit 1; } awk {print $1} $log_file | sort | uniq -c | sort -nr | head -10技巧5.3系统监控脚本#!/bin/bash # 资源监控告警脚本 threshold90 # 百分比 check_disk() { local usage$(df -h / | awk NR2 {print $5} | tr -d %) (( usage threshold )) \ send_alert 磁盘使用率过高: $usage% } check_memory() { local free$(free -m | awk NR2 {printf %.0f, $3*100/$2}) (( free threshold )) \ send_alert 内存使用率过高: $free% } send_alert() { local message[ALERT] $1 echo $message | mail -s 系统告警 adminexample.com echo $(date): $message /var/log/system_monitor.log }

更多文章