Shell脚本高级技巧与错误处置处罚

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

逾越基础:Shell脚本高级技巧与错误处置处罚

掌握了Shell脚本的基础后,是时间迈向更高条理——编写健壮、高效且可维护的脚本。
函数与模块化:如何编写可复用的函数

当脚本变得复杂时,重复代码会降低可读性和维护性。函数可以将代码模块化,提高复用性。
定义和调用函数

函数定义无需特别关键字,直接写函数名和代码块:
  1. #!/bin/bash
  2. # 定义函数
  3. say_hello() {
  4.         echo "Hello, $1!"
  5. }
  6. # 调用函数
  7. say_hello "Alice"
  8. say_hello "Bob"
复制代码
输出:
  1. Hello, Alice!
  2. Hello, Bob!
复制代码



  • $1 是函数的第一个参数,类似脚本中的命令行参数。
带返回值的函数

Shell函数返回值通常通过全局变量或退出码实现:
  1. #!/bin/bash
  2. add_numbers() {
  3.         local SUM=$(( $1 + $2 ))
  4.     echo $SUM  # 输出结果
  5. }
  6. RESULT=$(add_numbers 3 5)
  7. echo "3 + 5 = $RESULT"
复制代码
输出:3 + 5 = 8

模块化实践

将常勤奋能封装成函数,并保存到外部文件(如 utils.sh),然后在脚本中引入:
  1. # utils.sh
  2. log() {
  3.         echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> /var/log/script.log
  4. }
复制代码
  1. #!/bin/bash
  2. source ./utils.sh
  3. log "脚本开始执行"
  4. echo "做一些工作..."
  5. log "脚本结束"
复制代码
通过 source 或 .引入外部文件,实当代码复用。


错误处置处罚:退出码、trap和日记

生产环境的脚本必须能处置处罚错误,制止因非常导致系统混乱。
利用退出码

每个命令执行后都有一个退出码(0 表现成功,非 0 表现失败),可用 $? 检查:
  1. #!/bin/bash
  2. ls /nonexistent
  3. if [ $? -ne 0 ]; then
  4.         echo "错误:目录不存在"   
  5.         exit 1  # 非零退出码表示脚本失败
  6. fi
复制代码

trap捕获信号

trap 命令可捕获中断信号(如Ctrl+C)或脚本退出时的状态:
  1. #!/bin/bash
  2. cleanup() {
  3.         echo "脚本被中断,正在清理..."
  4.     # 清理临时文件等
  5.     exit 1
  6. }
  7. trap cleanup INT TERM  # 捕获中断和终止信号
  8. echo "运行中,按Ctrl+C测试"
  9. sleep 100
复制代码
按Ctrl+C后,脚本会执行 cleanup 函数。

记录错误日记

将错误信息记录到日记文件,便于排查题目:
  1. #!/bin/bash
  2. LOG_FILE="/var/log/script_errors.log"
  3. log_error() {
  4.         echo "$(date) - ERROR: $1" >> "$LOG_FILE"
  5. }
  6. ls /nonexistent 2>/dev/null || log_error "无法访问目录"
  7. echo "继续执行..."
复制代码


  • 2>/dev/null:屏蔽尺度错误输出。
  • ||:前命令失败时执行后命令。

脚本优化:提高性能的最佳实践

高效的脚本不但功能强大,还要运行敏捷且资源占用低。
1. 减少外部命令调用

频仍调用外部命令(如 grep、awk)会增加开销,只管利用Shell内置功能:
  1. # 低效
  2. COUNT=$(ls -l | wc -l)
  3. # 高效
  4. files=( * )
  5. COUNT=${#files[@]}
复制代码
2. 并行执行

对于耗时任务,利用配景历程(&)并行运行:
  1. #!/bin/bash
  2. task() {
  3.         echo "任务 $1 開始"
  4.     sleep 2
  5.     echo "任務 $1 完成"
  6. }
  7. task 1 &
  8. task 2 &
  9. wait  # 等待所有后台任务完成
复制代码
3. 制止冗余操纵

缓存重复利用的效果:
  1. #!/bin/bash
  2. # 每次调用date都重新计算
  3. for i in {1..3}; do
  4.         echo "$(date) - 循环 $i"
  5. done
  6. # 优化:只计算一次
  7. NOW=$(date)
  8. for i in {1..3}; do
  9.         echo "$NOW - 循环 $i"
  10. done
复制代码

实战案例:自动化用户管理

以下是一个完备的用户管理脚本,包含创建、删除用户和权限设置功能。
  1. #!/bin/bash
  2. LOG_FILE="/var/log/user_management.log"
  3. USERNAME=""
  4. ACTION=""
  5. # 函数:记录日志
  6. log() {
  7.         echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
  8. }
  9. # 函数:检查用户是否存在
  10. check_user() {
  11.         if id "$1" &>/dev/null; then
  12.             return 0  # 用户存在   
  13.     else
  14.             return 1   
  15.     fi
  16. }
  17. # 函数:创建用户
  18. create_user() {
  19.         if check_user "$1"; then
  20.             log "用户 $1 已存在"        
  21.             echo "用户 $1 已存在"
  22.     else
  23.             useradd -m "$1" && echo "用户 $1 创建成功" || log "创建用户 $1 失败"
  24.         passwd "$1"  # 设置密码
  25.         chmod 700 "/home/$1"  # 设置权限     
  26.         log "用户 $1 创建并配置完成"
  27.     fi
  28. }
  29. # 函数:删除用户
  30. delete_user() {
  31.         if check_user "$1"; then
  32.             userdel -r "$1" && echo "用户 $1 删除成功" || log "删除用户 $1 失败"
  33.         log "用户 $1 已删除"
  34.     else
  35.             echo "用户 $1 不存在"
  36.         log "尝试删除不存在的用户 $1"
  37.     fi
  38. }
  39. # 主逻辑
  40. if [ $# -ne 2 ]; then
  41.         echo "用法:$0 {create|delete} 用户名"
  42.         exit 1
  43. fi
  44. ACTION=$1
  45. USERNAME=$2
  46. case $ACTION in
  47.         create) create_user "$USERNAME";;
  48.     delete) delete_user "$USERNAME";;
  49.     *) echo "无效操作:$ACTION"; exit 1;;
  50. esac
  51. exit 0
复制代码
利用方法



  • 创建用户:./user_manage.sh create testuser
  • 删除用户:./user_manage.sh delete testuser
功能亮点



  • 模块化:将创建和删除逻辑封装为函数。
  • 错误处置处罚:检查用户是否存在,记录失败日记。
  • 安全性:设置公道的目次权限。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表