首页 > 课堂 > 基础知识 > 正文

shell的参数和脚本流程改进

2024-09-12 20:30:07
字体:
来源:转载
供稿:网友
  今天痛下决心,把事务的工作一定要使用平台来做,时间短,任务紧,之前的运维开发是铺了一个面,每个面都做一些相关的事情,所以工作整体看都有进展,但是最后没有一个专注的功能。
 
  所以我就在想到底是怎么回事,我能不能专注一些,哪怕就实现一个简单的功能,把它做好做透,其他的功能是不是能够同样复制很多的思想。于是乎,上班后我开始整理自己的思路,一边问自己,一边回答,每个回答都对应两列,一个是需要做的改进(action),还有一个是这个action的预估时间。结果几分钟下来,我发现如果理想的情况下,我只需要2个小时就能搞定,这么一想,还是能接受的,于是对需要做的事情排了一个顺序,立马开干。
 
  我的设计是使用运维平台连接中控服务器来级联触发远程操作,这样运维平台对所有环境的耦合性是最低的。
 
  哪怕是最简陋的操作,也要咬着牙完成,于是大体是这样的流程,上午的时候有两个部署需求,下午有两个,第一个是在半调试状态下完成的,第二个开始做脚本的模块化整理,是一个半自动的过程,然后发现了一些问题,非常纠结的去修复历史部署问题,等到第三个需求的时候,明显好了许多,到了第四个,就可以一口气完成了,流程打通了,细节就可以打磨了。
 
  于是我对有的脚本的逻辑进行改造,有一个很通用的需求,假设脚本是initdb.sh要调用这个脚本需要输入一系列的参数,比如有5个参数。
 
  这个脚本里面有10个步骤,每个步骤都是使用function来实现的。如果要处理这5个参数,同时能够控制10个步骤的执行,比如第2步不执行,第3步执行。脚本中其实还是比较难以管理和实现的。
 
  我设想了几种实现思路:
 
  1)把10个步骤拆分成10个脚本,然后每个脚本都有自己的调用方式,独立控制
 
  2)写一个配置脚本,比如main.sh然后在这个脚本里控制initdb.sh的执行情况
 
  第二种看起来好一些,但是问题还是没有解决,因为参数怎么管理,10个步骤怎么处理还是得细化。
 
  我的初步设想是5个参数,外带一个参数即可,前面五个参数和一个步骤的参数。
 
  预期执行情况大体如下:
 
  # sh a.sh x x x x x 'init1 init3 init2'
 
  init1
 
  init3
 
  init2
 
  即执行的时候是按照init1 init3 init2的方式执行的。
 
  关键代码如下:
 
  function init1(){
 
  echo 'init1'
 
  }
 
  function init2(){
 
  echo 'init2'
 
  }
 
  function init3(){
 
  echo 'init3'
 
  }
 
  function initdb(){
 
  arr=$1
 
  for fun in ${arr[*]}; do
 
  echo $i
 
  case $fun in
 
  init1)
 
  echo "test init1"
 
  init1
 
  ;;
 
  init2)
 
  echo "test init2"
 
  init2
 
  ;;
 
  init3)
 
  echo "test init3"
 
  init3
 
  ;;
 
  *)
 
  echo "out of scope"
 
  esac
 
  done
 
  }
 
  init_par=$1
 
  actions=($init_par)
 
  initdb "${actions[*]}"
 
  执行结果如下:
 
  [root@dev01 test]# sh a.sh 'init1 init3 init2'
 
  test init1
 
  init1
 
  test init3
 
  init3
 
  test init2
 
  init2
 
  这里有个问题,那就是我们输入的操作步骤可能是无序的,但是执行的时候是希望按照顺序,比如步骤2是依赖于步骤1的,这个我们是明确的。如果要实现这样一个需求,就需要额外的一些补充,那就是排序功能,或者是前端传入的时候来控制更好。
 
  没事,能者多劳,我们就先实现了。保证能正确的运行起来,于是代码又开始一通改动。
 
  function init1(){
 
  echo 'init1'
 
  }
 
  function init2(){
 
  echo 'init2'
 
  }
 
  function init3(){
 
  echo 'init3'
 
  }
 
  function initdb(){
 
  arr=$1
 
  complete_arr=(init3 init1 init2)
 
  order_arr=()
 
  for act_tmp in ${complete_arr[*]}; do
 
  if [[ " ${arr[@]} " =~ " $act_tmp " ]];then
 
  echo $act_tmp
 
  order_arr[${#order_arr[@]}]=$act_tmp
 
  echo order_arr[${#order_arr[@]}]
 
  fi
 
  done
 
  for fun in ${order_arr[*]}; do
 
  echo $i
 
  case $fun in
 
  init1)
 
  echo "test init1"
 
  init1
 
  ;;
 
  init2)
 
  echo "test init2"
 
  init2
 
  ;;
 
  init3)
 
  echo "test init3"
 
  init3
 
  ;;
 
  *)
 
  echo "out of scope"
 
  esac
 
  done
 
  }
 
  init_par=$1
 
  actions=($init_par)
 
  initdb "${actions[*]}"
 
  假设正确的步骤我们改为了init3 init1 init2,传入参数为init1 init3 init2,如果能够转换,幸福感就大大提高了。
 
  脚本的执行结果如下:
 
  [root@dev01 test]# sh aa.sh 'init1 init3 init2'
 
  init3
 
  order_arr[1]
 
  init1
 
  order_arr[2]
 
  init2
 
  order_arr[3]
 
  test init3
 
  init3
 
  test init1
 
  init1
 
  test init2
 
  init2
 
  可见是达到了预期的目标了,所以这个思路可以借鉴,在其他的地方也可以参考使用。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表