shell demo analyse------ 1

前端之家收集整理的这篇文章主要介绍了shell demo analyse------ 1前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

海思压缩板带的SDK中的解压缩脚本

标签(空格分隔): 未分类


shell好久不写就忘记了语法,以后周期性的分析一些demo来熟悉一下,学习shell仅仅因为兴趣,运维方面没有接触过,所以很low,欢迎志同道合的一块学习,当然不会分析具体的一些命令


common.sh,相当于定义好的函数库,在脚本中使用 source scripts/common.sh就可以使用这些函数,下面主要分析一些函数

  1. #!/bin/sh
  2.  
  3. #set -e #当发生错误退出脚本,防止雪球效应
  4.  
  5. #----------------------------定义变量---------------------------------
  6. # for debug
  7. DEBUG_LOG_FILE='&2'
  8. DEBUG_LOG_LEVEL=0
  9.  
  10. # ANSI COLORS #定义了一些颜色,打印输出带颜色字符串
  11. COLOR_CRE=""
  12. COLOR_NORMAL=""
  13. COLOR_RED=""
  14. COLOR_GREEN=""
  15. COLOR_YELLOW=""
  16. COLOR_BLUE=""
  17. COLOR_MAGENTA=""
  18. COLOR_CYAN=""
  19. COLOR_WHITE=""
  20.  
  21. # Shell command
  22. TAR=tar
  23. CP=/bin/cp
  24. RM=/bin/rm
  25. GREP=grep
  26. SED=sed
  27. MKDIR=mkdir
  28. CHMOD=chmod
  29. MV=mv
  30. CD=cd
  31. LN=ln
  32. MAKE=make
  33. MKNOD=mknod
  34. PUSHD=pushd
  35. POPD=popd
  36. RMDIR=rmdir
  37. DEPMOD=/sbin/depmod
  38. RMDIR=rmdir
  39. MKIMG=mkimage
  40. PATCH=patch
  41. DIFF=diff
  42. TOUCH=touch
  43. CAT=cat
  44.  
  45. #下面定义了年月日一些时间格式
  46. e_blank='[ ][ ]*'
  47. e_year='20[0-9][0-9]'
  48. e_month='([1-9]|0[1-9]|1[0-2])'
  49. e_day='([1-9]|0[1-9]|[12][0-9]|3[0-1])'
  50. e_time='([01][0-9]|2[0-3]):[0-5][0-9]'
  51. e_employid='[a-zA-Z][a-zA-Z]*[0-9]{4,}'
  1. #------------------------打印语句函数----------------------------------
  2.  
  3. #fun: 当输入的参数$2不为空就按照$2颜色输出,否则正常输出
  4. #$1: string
  5. #$2: color
  6. ECHO()
  7. {
  8. [ -n "$2" ] && eval echo -n \"\${${2}}\"; echo "${1}${COLOR_NORMAL}" } #fun: 红色字体输出到标准错误错误信息输出使用 #$1: string ERR() { echo "${COLOR_RED} ERR: ${1}${COLOR_NORMAL}" >&2 } #fun: 黄色字体输出到标准错误,警告信息输出使用 #$1: string WARN() { echo "${COLOR_YELLOW}WARN: ${1}${COLOR_NORMAL}" >&2 } # $1: LOG() { echo "$1" } #fun: debug调试使用,当$2参数为空就不打印 #$1: string #$2: level DEBUG() { local level=$2 [ -z "$level" ] && { level=0; } [ $level -lt $DEBUG_LOG_LEVEL ] && return 0; echo "$COLOR_WHITE$1$COLOR_NORMAL" > $DEBUG_LOG_FILE } #---------------------压缩文件加压------------------------------------- #fun: 解压缩模仿进度条,使用的是下面那个,这个感兴趣可以自己分析 # $1: command # $2: LR/CR steps run_command_progress() { local n=0 local steps=$2 local progress_bar="" local counter=0 local files=0 ECHO "run_command_progress: '$1'" [ -z "$steps" ] && { steps=1; } [ -n "$3" ] && [ -d "$3" ] && { steps=`find $3 | wc -l`; steps=`expr $steps / 50`; } eval $1 | while read line do #((n++)) #((files++)) ((++n)) ((++files)) if [ $n -ge $steps ] ; then #((counter++)) ((++counter)) if [ $counter -le 50 ] ; then progress_bar="$progress_bar#";
  9. printf " --------------------------------------------------|\r[%03d]$progress_bar\r" $steps
  10. else
  11. printf "[%03d#$progress_bar|\r" `expr $files / 50`
  12. fi
  13.  
  14. n=0
  15. fi
  16. done
  17.  
  18. echo ""
  19. }
  20.  
  21. #fun: 解压缩模仿进度条
  22. # $1: command tar -xvzf package/osdrv.tgz 解压命令
  23. # $2: total 0 默认的要解压文件总数目
  24. # $3: command to calc totals tar -tzf package/osdrv.tgz | wc -l 要解压文件总数目
  25. run_command_progress_float()
  26. {
  27. local readonly RCP_RANGE=50
  28. local rcp_lines=0
  29. local rcp_nextpos=1
  30. local rcp_total=0 #文件总数
  31. local progress_bar=
  32. local rcp_prog=0
  33. local rcp_tmp=0
  34. local prog_bar_base=
  35. local rcp_percent=0
  36.  
  37. ECHO "run_command_progress_float: '$1'"
  38.  
  39. #得到解压文件的总数目赋值给rcp_total
  40. if [ -n "$3" ] ;
  41. then
  42. echo -n "Initializing progress bar ..."
  43. rcp_total=`eval $3`;
  44. echo -n "\r"
  45. [ -z "$rcp_total" ] && rcp_total=1
  46. else
  47. [ -n "$2" ] && rcp_total=$2
  48. fi
  49.  
  50. [ -z "$rcp_total" ] && rcp_total=1
  51. [ $rcp_total -le 0 ] && rcp_total=1
  52.  
  53.  
  54. #prog_bar_base 变量拼凑出 "[ ]----------------------------------------------------" 代表解压进度显示。方括号内部代表进度百分比
  55. prog_bar_base="[ ]"
  56. while [ $rcp_tmp -lt $RCP_RANGE ]
  57. do
  58. prog_bar_base="$prog_bar_base-"
  59. #((rcp_tmp++))
  60. ((++rcp_tmp))
  61. done
  62. prog_bar_base="${prog_bar_base}|"
  63. printf "\r$prog_bar_base\r"
  64.  
  65.  
  66. set +e
  67. eval $1 | while read line
  68. do
  69. #((rcp_lines++)) rcp_lines代表文件数目,每次加一
  70. ((++rcp_lines))
  71.  
  72. #当解压文件数目到达总数目的一个百分比时会进入if
  73. if [ $rcp_lines -ge $rcp_nextpos ]
  74. then
  75. rcp_percent=`expr \( $rcp_lines \* 101 - 1 \) / $rcp_total ` #解压缩文件数目百分比
  76. rcp_prog=`expr \( $rcp_lines \* \( $RCP_RANGE + 1 \) - 1 \) / $rcp_total ` #进度条百分比
  77. [ $rcp_prog -gt $RCP_RANGE ] && rcp_prog=$RCP_RANGE #进度条百度比不可以超过最大值
  78. rcp_nextpos=`expr \( \( $rcp_percent + 1 \) \* $rcp_total \) / 100` #下次解压缩多少文件进度条可以变化1%
  79. [ $rcp_nextpos -gt $rcp_total ] && rcp_nextpos=$rcp_total
  80.  
  81. rcp_tmp=0
  82. progress_bar=""
  83. while [ $rcp_tmp -lt $rcp_prog ]
  84. do
  85. progress_bar="$progress_bar#"
  86. ((rcp_tmp++))
  87. done
  88. printf "\r$prog_bar_base\r[%3d%%]$progress_bar\r" $rcp_percent #最终格式化输出进度条
  89. fi
  90. done
  91. set -e
  92.  
  93. echo ""
  94. }
  1. #fun: 打印$1的绝对路径
  2. #$1: path
  3. abs_path()
  4. {
  5. #先进入到$1目录,在没有错误的情况下执行pwd得到绝对路径,在popd出栈
  6. pushd "$1" >/dev/null
  7. [ $? -ne 0 ] && return 1;
  8. pwd
  9. popd >/dev/null
  10. }
  11.  
  12. #fun: 在一个父路径下创建好多文件
  13. # $1: prefix 父路径
  14. # $2..$n: dirs list 众多子文件
  15. make_dirs()
  16. {
  17. local make_dirs_count=2
  18. local make_dirs_dir=
  19.  
  20. #参数判断 ,创建父路径文件
  21. [ -z "$1" ] && { ERR "make_dirs mast have a prefix dir!"; return 1; }
  22. $MKDIR $1 -p
  23.  
  24. #在父路径下新建子文件
  25. while true
  26. do
  27. eval make_dirs_dir=\${$make_dirs_count} #子文件名称 $2 $3 ... $n
  28. [ -z "$make_dirs_dir" ] && break; #如果参数执行完毕就退出循环
  29. $MKDIR $1/$make_dirs_dir -p #创建子文件
  30. #((make_dirs_count++))
  31. ((++make_dirs_count))
  32. done
  33. }
  34.  
  35. #fun:字符串中把处理字符数字和_的其他字符全部变成_
  36. string_to_varname()
  37. {
  38. echo "$1" | sed 's/[^a-zA-Z0-9_]/_/g'
  39. }
  40.  
  41. #fun: 1.先按照)分割内容拿到第一列数据
  42. # 2.把所以的( | 字符转换成空格
  43. patchset_get_param()
  44. {
  45. echo "$1" | cut -d')' -f1 | sed 's/[\(\|]/ /g'
  46. }

common.sh的其他函数下次接着分析,接下来分析sdk.unpack,主要作用是解压缩sdk源码包

  1. #!/bin/sh
  2. source scripts/common.sh #包含上面分析的函数
  3.  
  4. #ECHO WARN 函数都在前面声明了
  5. ECHO "Unpacking SDK" COLOR_YELLOW
  6.  
  7. WARN "Be sure you have installed the cross-compiler. if not,install it first!"
  8. WARN "ALL THE SOUCE FILES WILL BE OVERWRITED,FILES YOU MOTIFIED WILL BE LOST !!!"
  9. ECHO ""
  10.  
  11. set +e #出错了接着执行
  12.  
  13. #可以看出下面的步骤都一样,就只分析第一个
  14.  
  15. ECHO "unpacking osdrv"
  16. mkdir -p osdrv/ #在当前目录下创建目录osdrv
  17. run_command_progress_float "tar -xvzf package/osdrv.tgz" 0 "tar -tzf package/osdrv.tgz | wc -l" #我们上面分析的解压压缩包,模拟了一个bar
  18.  
  19. ECHO "unpacking kernel"
  20. mkdir -p osdrv/
  21. run_command_progress_float "tar -xvzf osdrv/opensource/kernel/linux-3.4.y.tgz -C osdrv/opensource/kernel/" 0 "tar -tzf osdrv/opensource/kernel/linux-3.4.y.tgz | wc -l"
  22.  
  23. if [ "$SDK_CHIP" = "hi3519" ]; then
  24. ECHO "unpacking mpp_single"
  25. mkdir -pv mpp_single
  26. run_command_progress_float "tar -xvzf package/mpp_single.tgz" 0 "tar -tzf package/mpp_single.tgz | wc -l"
  27.  
  28. ECHO "unpacking mpp_big-little"
  29. mkdir -pv mpp_big-little
  30. run_command_progress_float "tar -xvzf package/mpp_big-little.tgz" 0 "tar -tzf package/mpp_big-little.tgz | wc -l"
  31. else
  32. ECHO "unpacking mpp"
  33. mkdir -pv mpp
  34. run_command_progress_float "tar -xvzf package/mpp.tgz" 0 "tar -tzf package/mpp.tgz | wc -l"
  35. fi
  36.  
  37. ECHO "unpacking drv"
  38. mkdir -pv drv
  39. run_command_progress_float "tar -xvzf package/drv.tgz" 0 "tar -tzf package/drv.tgz | wc -l"

猜你在找的Bash相关文章