微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shell demo analyse------ 1

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

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

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

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

#!/bin/sh

#set -e #当发生错误退出脚本,防止雪球效应

#----------------------------定义变量---------------------------------
# for debug
DEBUG_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=tar
CP=/bin/cp
RM=/bin/rm
GREP=grep
SED=sed
MKDIR=mkdir
CHMOD=chmod
MV=mv
CD=cd
LN=ln
MAKE=make
MKNOD=mknod
PUSHD=pushd 
POPD=popd 
RMDIR=rmdir
DEPMOD=/sbin/depmod
RMDIR=rmdir
MKIMG=mkimage
PATCH=patch
DIFF=diff
TOUCH=touch
CAT=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: color
ECHO()
{
    [ -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#";
                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: path
abs_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/sh
source scripts/common.sh  #包含上面分析的函数

#ECHO WARN 函数都在前面声明了
ECHO "Unpacking SDK" COLOR_YELLOW

WARN "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/        #在当前目录下创建目录osdrv
run_command_progress_float "tar -xvzf package/osdrv.tgz" 0 "tar -tzf package/osdrv.tgz | wc -l"  #我们上面分析的解压压缩包,模拟了一个bar

ECHO "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" ]; then
ECHO "unpacking mpp_single"
mkdir -pv mpp_single
run_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-little
run_command_progress_float "tar -xvzf package/mpp_big-little.tgz" 0 "tar -tzf package/mpp_big-little.tgz | wc -l"
else
ECHO "unpacking mpp"
mkdir -pv mpp
run_command_progress_float "tar -xvzf package/mpp.tgz" 0 "tar -tzf package/mpp.tgz | wc -l"
fi

ECHO "unpacking drv"
mkdir -pv drv
run_command_progress_float "tar -xvzf package/drv.tgz" 0    "tar -tzf package/drv.tgz | wc -l"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐