shell demo analyse------ 1

来源:互联网 发布:js 什么时候使用链表 编辑:程序博客网 时间:2024/06/08 18:02

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

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


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


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

#!/bin/sh#set -e                             #当发生错误时退出脚本,防止雪球效应#----------------------------定义变量---------------------------------# for debugDEBUG_LOG_FILE='&2'  DEBUG_LOG_LEVEL=0# ANSI COLORS                       #定义了一些颜色,打印输出带颜色字符串COLOR_CRE=""COLOR_NORMAL=""COLOR_RED=""COLOR_GREEN=""COLOR_YELLOW=""COLOR_BLUE=""COLOR_MAGENTA=""COLOR_CYAN=""COLOR_WHITE=""# Shell command             TAR=tarCP=/bin/cpRM=/bin/rmGREP=grepSED=sedMKDIR=mkdirCHMOD=chmodMV=mvCD=cdLN=lnMAKE=makeMKNOD=mknodPUSHD=pushd POPD=popd RMDIR=rmdirDEPMOD=/sbin/depmodRMDIR=rmdirMKIMG=mkimagePATCH=patchDIFF=diffTOUCH=touchCAT=cat#下面定义了年月日一些时间格式e_blank='[        ][      ]*'e_year='20[0-9][0-9]'e_month='([1-9]|0[1-9]|1[0-2])'e_day='([1-9]|0[1-9]|[12][0-9]|3[0-1])'e_time='([01][0-9]|2[0-3]):[0-5][0-9]'e_employid='[a-zA-Z][a-zA-Z]*[0-9]{4,}'
#------------------------打印语句函数----------------------------------#fun: 当输入的参数$2不为空就按照$2颜色输出,否则正常输出#$1: string#$2: colorECHO(){    [ -n "$2" ] && eval echo -n \"\${${2}}\";    echo "${1}${COLOR_NORMAL}"}#fun: 红色字体输出到标准错误,错误信息输出使用#$1: stringERR(){    echo "${COLOR_RED} ERR: ${1}${COLOR_NORMAL}" >&2}#fun: 黄色字体输出到标准错误,警告信息输出使用#$1: stringWARN(){    echo "${COLOR_YELLOW}WARN: ${1}${COLOR_NORMAL}" >&2}# $1:LOG(){    echo "$1"}#fun: debug调试使用,当$2参数为空就不打印#$1: string#$2: levelDEBUG(){    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 stepsrun_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#";                printf "     --------------------------------------------------|\r[%03d]$progress_bar\r" $steps            else                printf "[%03d#$progress_bar|\r" `expr $files / 50`            fi            n=0        fi    done    echo ""}#fun:  解压缩模仿进度条# $1: command   tar -xvzf package/osdrv.tgz 解压命令# $2: total      0  默认的要解压文件总数目# $3: command to calc totals   tar -tzf package/osdrv.tgz | wc -l 要解压文件总数目run_command_progress_float(){    local readonly RCP_RANGE=50    local rcp_lines=0    local rcp_nextpos=1    local rcp_total=0                                            #文件总数    local progress_bar=    local rcp_prog=0    local rcp_tmp=0    local prog_bar_base=    local rcp_percent=0    ECHO "run_command_progress_float: '$1'"     #得到解压文件的总数目赋值给rcp_total    if [ -n "$3" ] ;    then        echo -n "Initializing progress bar ..."        rcp_total=`eval $3`;        echo -n "\r"        [ -z "$rcp_total" ] && rcp_total=1    else        [ -n "$2" ] && rcp_total=$2    fi    [ -z "$rcp_total" ] && rcp_total=1    [ $rcp_total -le 0 ] && rcp_total=1    #prog_bar_base 变量拼凑出 "[  ]----------------------------------------------------" 代表解压进度显示。方括号内部代表进度百分比    prog_bar_base="[    ]"    while [ $rcp_tmp -lt $RCP_RANGE ]    do        prog_bar_base="$prog_bar_base-"                  #((rcp_tmp++))         ((++rcp_tmp))     done    prog_bar_base="${prog_bar_base}|"    printf "\r$prog_bar_base\r"    set +e    eval $1 | while read line    do        #((rcp_lines++))  rcp_lines代表文件数目,每次加一        ((++rcp_lines))        #当解压文件数目到达总数目的一个百分比时会进入if        if [ $rcp_lines -ge $rcp_nextpos ]        then            rcp_percent=`expr \( $rcp_lines \* 101 - 1 \) / $rcp_total `                     #解压缩文件数目百分比            rcp_prog=`expr \( $rcp_lines \* \( $RCP_RANGE + 1 \) - 1 \) / $rcp_total `        #进度条百分比            [ $rcp_prog -gt $RCP_RANGE ] && rcp_prog=$RCP_RANGE                              #进度条百度比不可以超过最大值                rcp_nextpos=`expr \( \( $rcp_percent + 1 \) \* $rcp_total \) / 100`                #下次解压缩多少文件进度条可以变化1%            [ $rcp_nextpos -gt $rcp_total ] && rcp_nextpos=$rcp_total            rcp_tmp=0            progress_bar=""            while [ $rcp_tmp -lt $rcp_prog ]            do                progress_bar="$progress_bar#"                ((rcp_tmp++))            done            printf "\r$prog_bar_base\r[%3d%%]$progress_bar\r" $rcp_percent                   #最终格式化输出进度条        fi    done    set -e    echo ""}
#fun: 打印$1的绝对路径#$1: pathabs_path(){    #先进入到$1目录,在没有错误的情况下执行pwd得到绝对路径,在popd出栈    pushd "$1" >/dev/null    [ $? -ne 0 ] && return 1;    pwd    popd >/dev/null}#fun: 在一个父路径下创建好多文件夹# $1: prefix    父路径# $2..$n: dirs list   众多子文件夹make_dirs(){    local make_dirs_count=2    local make_dirs_dir=    #参数判断 ,创建父路径文件夹    [ -z "$1" ] && { ERR "make_dirs mast have a prefix dir!"; return 1; }    $MKDIR $1 -p    #在父路径下新建子文件夹    while true    do        eval make_dirs_dir=\${$make_dirs_count}  #子文件夹名称 $2 $3 ... $n        [ -z "$make_dirs_dir" ] && break;       #如果参数执行完毕就退出循环        $MKDIR $1/$make_dirs_dir -p              #创建子文件夹        #((make_dirs_count++))        ((++make_dirs_count))    done}#fun:字符串中把处理字符数字和_的其他字符全部变成_string_to_varname(){    echo "$1" | sed 's/[^a-zA-Z0-9_]/_/g'}#fun: 1.先按照)分割内容拿到第一列数据 #     2.把所以的(  | 字符转换成空格patchset_get_param(){    echo "$1" | cut -d')' -f1 | sed 's/[\(\|]/ /g'}

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

#!/bin/shsource scripts/common.sh  #包含上面分析的函数#ECHO WARN 函数都在前面声明了ECHO "Unpacking SDK" COLOR_YELLOWWARN "Be sure you have installed the cross-compiler. if not, install it first!"WARN "ALL THE SOUCE FILES WILL BE OVERWRITED, FILES YOU MOTIFIED WILL BE LOST !!!"ECHO ""set +e   #出错了接着执行#可以看出下面的步骤都一样,就只分析第一个ECHO "unpacking osdrv"mkdir -p osdrv/        #在当前目录下创建目录osdrvrun_command_progress_float "tar -xvzf package/osdrv.tgz" 0 "tar -tzf package/osdrv.tgz | wc -l"  #我们上面分析的解压压缩包,模拟了一个barECHO "unpacking kernel"mkdir -p osdrv/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"if [ "$SDK_CHIP" = "hi3519" ]; thenECHO "unpacking mpp_single"mkdir -pv mpp_singlerun_command_progress_float "tar -xvzf package/mpp_single.tgz" 0 "tar -tzf package/mpp_single.tgz | wc -l"ECHO "unpacking mpp_big-little"mkdir -pv mpp_big-littlerun_command_progress_float "tar -xvzf package/mpp_big-little.tgz" 0 "tar -tzf package/mpp_big-little.tgz | wc -l"elseECHO "unpacking mpp"mkdir -pv mpprun_command_progress_float "tar -xvzf package/mpp.tgz" 0 "tar -tzf package/mpp.tgz | wc -l"fiECHO "unpacking drv"mkdir -pv drvrun_command_progress_float "tar -xvzf package/drv.tgz" 0    "tar -tzf package/drv.tgz | wc -l"
原创粉丝点击