linux sh : 由未实现函数引起bash读取2进制附加数据引起的报错

前言

写好的linux安装包管理脚本附加了tar文件.
运行安装包,本来要执行安装管理脚本,可是没运行,直接报错。说2进制附加数据里面有语法错误.
刚写好的脚本100行左右,开始没看出是哪引起的错误。正常情况是,bash见到exit 0就不执行了,也不会去分析后面的附加数据。
后来用屏蔽法,从最小化的实现开始增量的放开代码。发现是有个函数没实现,有一句脚本的变量使用时多了一个双引号,引起语法不匹配。
用bash -n x.sh,只能查语法错误。这个报错的sh, 用bash -n检查是没错的。感觉bash -n 这个功能做的挺渣的。
可能bash看到了未实现的函数,而且exit 0后面还有实现(其实是2进制附加数据),就去查未实现函数。导致了这种非常奇怪的错误提示。如果提示,也要指出是这个函数未实现才对啊。
找这个bug用了大半天,问题解决后,对bash脚本的编码有了进一步的体会。
* 单元测试,每一个新加入的函数,都要测试通过才往下走,否则等代码写长了,bash报错又那么模糊。不好找问题的初始点了。
* 脚本是弱类型的语言,变量要显示声明,用到的函数要实现,编码要仔细。代码不能拷贝来拷贝去,尽量整理成函数。如果要从其他工程拷贝函数过来,要理清楚,不要留没使用的变量和未实现的子函数。
* 用si当IDE时,可以将Makefile类型的文件规则里面加入sh..sh, 再编辑脚本时,就有语法高亮了,如果有手误的代码,能辅助判断出来一些。当然,用眼睛仔细看还是主要的。
* 为了代码复用,尽量将功能封装成函数(按照功能分布在不同的sh中)再使用。对于安装管理脚本+附加数据这种类型的脚本,就只能将其他sh中封装好的函数都拷贝过来。这时tar文件还没有释放,没有helper可用。
* 对于脚本本身的编程,感觉已经熟悉了,现在就差grep, sed, awk, 正则的进一步学习和练习了。

执行效果

这里写图片描述

脚本实现

#!/bin/bash --posix
# 启用bash增强功能 bash --posix

# @attention
#   bash -n x.sh
#   只能检查语法错误, 如果多一个双引号等手误, 报错不准确.
#   此时, 用si将*.sh或sh.*作为Makefile文件规则载入, 可以通过语法高亮的块来辅助识别, 不过识别效果也不是很好
#   用眼睛分析,还是主要的,
#   在加入一个函数时,要用测试用例将这个函数过一遍,确保没问题
#   只要新加入的代码,都进行测试,保证增量开发,错了也知道是哪里引起的
#   如果带病运行, 等代码行数多了,出现问题再调试,调试工作量增加了不少
#
#   如果调用了不存在的函数,会导致遇到exit0后,还会向后搜索(e.g. one.sh append binary_data_file)
#   如果bash分析到2进制文件中,那报错就很难理解了. 所以,要保证脚本中要调用的函数都是存在,可用的
#   如果出现了bash搜索到bin文件内容的情况, sh代码一句都跑不起来
#
#   安装管理程序运行时, 文件还没有释放出来, 没有helper可以用
#   所有的实现,都要在这个sh中,自己完成

# 包含彩色打印接口库

# 安装管理实现
# __INSTALLER_MANAGER_SH_BEGIN__
# --------------------------------------------------------------------------------
#!/bin/bash --posix

# __SH_COLOR_DEFINE_BEGIN__
# --------------------------------------------------------------------------------

# @file sh.color_define
# @brief print color text
#   when print color text, don't use "\n" to end the echo or printf, 
#   how to use these interface see func_test_color_print()

# --------------------------------------------------------------------------------
# color basic define
# --------------------------------------------------------------------------------

<<MY_NOTE
                foreground background
black           30          40      # 黑
red             31          41      # 红
green           32          42      # 绿
yellow          33          43      # 黄
blue            34          44      # 蓝
magenta         35          45      # 品红
cyan            36          46      # 青
light gray      37          47      # 亮灰
default color   39          49      # 默认颜色
dark gray       90          100     # 深灰
light red       91          101     # 浅红
light green     92          102     # 浅绿
light yellow    93          103     # 浅黄
light blue      94          104     # 浅蓝
light magenta   95          105     # 洋红
light cyan      96          106     # 浅青
white           97          107     # 白

MY_NOTE

# color value - foreground
declare -r COLOR_TYPE_FG_BLACK="\e[30m"
declare -r COLOR_TYPE_FG_RED="\e[31m"
declare -r COLOR_TYPE_FG_GREEN="\e[32m"
declare -r COLOR_TYPE_FG_YELLOW="\e[33m"
declare -r COLOR_TYPE_FG_BLUE="\e[34m"
declare -r COLOR_TYPE_FG_MAGENTA="\e[35m"
declare -r COLOR_TYPE_FG_CYAN="\e[36m"
declare -r COLOR_TYPE_FG_LIGHT_GRAY="\e[37m"
declare -r COLOR_TYPE_FG_DEFAULT_COLOR="\e[39m"
declare -r COLOR_TYPE_FG_DARK_GRAY="\e[90m"
declare -r COLOR_TYPE_FG_LIGHT_RED="\e[91m"
declare -r COLOR_TYPE_FG_LIGHT_GREEN="\e[92m"
declare -r COLOR_TYPE_FG_LIGHT_YELLOW="\e[93m"
declare -r COLOR_TYPE_FG_LIGHT_BLUE="\e[94m"
declare -r COLOR_TYPE_FG_LIGHT_MAGENTA="\e[95m"
declare -r COLOR_TYPE_FG_LIGHT_CYAN="\e[96m"
declare -r COLOR_TYPE_FG_WHITE="\e[97m"

# color value - background
declare -r COLOR_TYPE_BG_BLACK="\e[40m"
declare -r COLOR_TYPE_BG_RED="\e[41m"
declare -r COLOR_TYPE_BG_GREEN="\e[42m"
declare -r COLOR_TYPE_BG_YELLOW="\e[43m"
declare -r COLOR_TYPE_BG_BLUE="\e[44m"
declare -r COLOR_TYPE_BG_MAGENTA="\e[45m"
declare -r COLOR_TYPE_BG_CYAN="\e[46m"
declare -r COLOR_TYPE_BG_LIGHT_GRAY="\e[47m"
declare -r COLOR_TYPE_BG_DEFAULT_COLOR="\e[49m"
declare -r COLOR_TYPE_BG_DARK_GRAY="\e[100m"
declare -r COLOR_TYPE_BG_LIGHT_RED="\e[101m"
declare -r COLOR_TYPE_BG_LIGHT_GREEN="\e[102m"
declare -r COLOR_TYPE_BG_LIGHT_YELLOW="\e[103m"
declare -r COLOR_TYPE_BG_LIGHT_BLUE="\e[104m"
declare -r COLOR_TYPE_BG_LIGHT_MAGENTA="\e[105m"
declare -r COLOR_TYPE_BG_LIGHT_CYAN="\e[106m"
declare -r COLOR_TYPE_BG_WHITE="\e[107m"

# color attrib set
declare -r COLOR_ATTRIB_BOLD="\e[1m"        # 粗体
declare -r COLOR_ATTRIB_DIM="\e[2m"     # 暗淡
declare -r COLOR_ATTRIB_UNDER_LINE="\e[4m"  # 下划线
declare -r COLOR_ATTRIB_BLINK="\e[5m"       # 闪烁
declare -r COLOR_ATTRIB_REVERSE="\e[7m"     # 颜色反转(前景色和背景色色交换)
declare -r COLOR_ATTRIB_HIDDEN="\e[8m"  # 隐藏文本, 用于口令的显示

# color attrib reset
declare -r COLOR_RESET="\e[0m"

# --------------------------------------------------------------------------------
# color function define
# --------------------------------------------------------------------------------

alias PRINT_ENTER_KEY="func_print_enter_key"
function func_print_enter_key() {
    printf "\n"
}

function func_parameter_forwarding_to_echo() {
    echo -e ${@:1}
    return 0
}

function func_parameter_forwarding_to_printf() {
    # printf 参数转发时, 参数1要用双引号围住
    # 其他参数也有可能包含空格,也要用双引号围住

    local param_format=""

    #
    # ok : method 1
    #
    # param_format=$1
    # shift
    # printf "$param_format" "$@"

    #
    # ok : method 2
    #
    # param_format=$1
    # printf "$param_format" "${@:2}"

    #
    # ok : method 3
    #
    # printf "${@:1}"

    #
    # ok : method 4
    #
    printf "$@"

    return 0
}

# --------------------------------------------------------------------------------
# app color function define
# --------------------------------------------------------------------------------

<<MY_NOTE
    调用print_color_text_x()时, 是按照printf函数调用的格式来的
    得到参数1, 加入颜色控制符, 连同剩下的入参, 转发给printf
    # "${@:2}" is content from parameter 2 to last parameter
MY_NOTE

# --------------------------------------------------------------------------------
# app color function define - set foreground color
# --------------------------------------------------------------------------------

alias PRINT_BLACK="func_print_color_text_black"
function func_print_color_text_black() {
    # bg = default, fg = black
    local new_parameter_1="$COLOR_TYPE_FG_BLACK$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_RED="func_print_color_text_red"
function func_print_color_text_red() {
    # bg = default, fg = red
    local new_parameter_1="$COLOR_TYPE_FG_RED$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_GREEN="func_print_color_text_green"
function func_print_color_text_green() {
    # bg = default, fg = green
    local new_parameter_1="$COLOR_TYPE_FG_GREEN$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_YELLOW="func_print_color_text_yellow"
function func_print_color_text_yellow() {
    # bg = default, fg = yellow
    local new_parameter_1="$COLOR_TYPE_FG_YELLOW$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_BLUE="func_print_color_text_blue"
function func_print_color_text_blue() {
    # bg = default, fg = blue
    local new_parameter_1="$COLOR_TYPE_FG_BLUE$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_MAGENTA="func_print_color_text_magenta"
function func_print_color_text_magenta() {
    # bg = default, fg = magenta
    local new_parameter_1="$COLOR_TYPE_FG_MAGENTA$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_CYAN="func_print_color_text_cyan"
function func_print_color_text_cyan() {
    # bg = default, fg = cyan
    local new_parameter_1="$COLOR_TYPE_FG_CYAN$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_WHITE="func_print_color_text_white"
function func_print_color_text_white() {
    # bg = default, fg = white
    local new_parameter_1="$COLOR_TYPE_FG_WHITE$COLOR_TYPE_BG_DEFAULT_COLOR$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

# --------------------------------------------------------------------------------
# app color function define - as log level - by printf
# after print obj, no print enter key
# --------------------------------------------------------------------------------
alias PRINT_INFO_NO_ENTER_KEY="func_print_color_text_info_no_enter_key"
function func_print_color_text_info_no_enter_key() {
    # fg = green

    #
    # method 1 ok
    # 
    PRINT_GREEN "$1" "${@:2}"

    #
    # method 2 ok
    # 
    # PRINT_GREEN "$@"

    #
    # method 3 ok
    # 
    # PRINT_GREEN "${@}"

    return 0
}

alias PRINT_NOTIFY_NO_ENTER_KEY="func_print_color_text_notify_no_enter_key"
function func_print_color_text_notify_no_enter_key() {
    # fg = cyan

    PRINT_CYAN "$1" "${@:2}"
    return 0
}

alias PRINT_WARN_NO_ENTER_KEY="func_print_color_text_warning_no_enter_key"
function func_print_color_text_warning_no_enter_key() {
    # fg = black, bg = yellow, bold
    local new_parameter_1="$COLOR_TYPE_FG_BLACK$COLOR_TYPE_BG_YELLOW$COLOR_ATTRIB_HOLD$COLOR_ATTRIB_UNDER_LINE$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

alias PRINT_ERR_NO_ENTER_KEY="func_print_color_text_error_no_enter_key"
function func_print_color_text_error_no_enter_key() {
    # fg = white, bg = red, blink, bold
    local new_parameter_1="$COLOR_TYPE_FG_WHITE$COLOR_TYPE_BG_RED$COLOR_ATTRIB_BLINK$COLOR_ATTRIB_HOLD$1$COLOR_RESET"

    func_parameter_forwarding_to_printf "$new_parameter_1" "${@:2}"
    return 0
}

# --------------------------------------------------------------------------------
# app color function define - as log level - by printf
# after print obj, print enter key
# --------------------------------------------------------------------------------
alias PRINT_INFO="func_print_color_text_info"
function func_print_color_text_info() {
    PRINT_INFO_NO_ENTER_KEY "$@"
    PRINT_ENTER_KEY
    return 0
}

alias PRINT_NOTIFY="func_print_color_text_notify"
function func_print_color_text_notify() {
    PRINT_NOTIFY_NO_ENTER_KEY "$@"
    PRINT_ENTER_KEY
    return 0
}

alias PRINT_WARN="func_print_color_text_warning"
function func_print_color_text_warning() {
    PRINT_WARN_NO_ENTER_KEY "$@"
    PRINT_ENTER_KEY
    return 0
}

alias PRINT_ERR="func_print_color_text_error"
function func_print_color_text_error() {
    PRINT_ERR_NO_ENTER_KEY "$@"
    PRINT_ENTER_KEY
    return 0
}

# --------------------------------------------------------------------------------
# app color function define - as log level - by echo
# --------------------------------------------------------------------------------
alias ECHO_INFO="func_echo_color_text_info"
function func_echo_color_text_info() {
    # fg = green, bg = default
    local new_parameter="$COLOR_TYPE_FG_GREEN$COLOR_TYPE_BG_DEFAULT_COLOR$(echo ${@:1})$COLOR_RESET"

    func_parameter_forwarding_to_echo $new_parameter
    return 0
}

alias ECHO_WARN="func_echo_color_text_warning"
function func_echo_color_text_warning() {
    # fg = black, bg = yellow, bold, under line
    local new_parameter="$COLOR_TYPE_FG_BLACK$COLOR_TYPE_BG_YELLOW$COLOR_ATTRIB_HOLD$COLOR_ATTRIB_UNDER_LINE$(echo ${@:1})$COLOR_RESET"

    func_parameter_forwarding_to_echo $new_parameter
    return 0
}

alias ECHO_ERR="func_echo_color_text_error"
function func_echo_color_text_error() {
    # fg = white, bg = red, blink, bold
    local new_parameter="$COLOR_TYPE_FG_WHITE$COLOR_TYPE_BG_RED$COLOR_ATTRIB_BLINK$COLOR_ATTRIB_HOLD$(echo ${@:1})$COLOR_RESET"

    func_parameter_forwarding_to_echo $new_parameter
    return 0
}

# --------------------------------------------------------------------------------
# only set color or reset color
# between set color and reset color, can call printf or echo text, the text is color
# --------------------------------------------------------------------------------
alias COLOR_BEGIN_INFO="func_color_begin_info"
function func_color_begin_info() {
    # fg = green, bg = default
    local new_parameter="$COLOR_TYPE_FG_GREEN$COLOR_TYPE_BG_DEFAULT_COLOR"

    echo -e $new_parameter
    return 0
}

alias COLOR_BEGIN_WARN="func_color_begin_warning"
function func_color_begin_warning() {
    # fg = black, bg = yellow, bold, under line
    local new_parameter="$COLOR_TYPE_FG_BLACK$COLOR_TYPE_BG_YELLOW$COLOR_ATTRIB_HOLD$COLOR_ATTRIB_UNDER_LINE"

    echo -e $new_parameter
    return 0
}

alias COLOR_BEGIN_ERR="func_color_begin_error"
function func_color_begin_error() {
    # fg = white, bg = red, blink, bold
    local new_parameter="$COLOR_TYPE_FG_WHITE$COLOR_TYPE_BG_RED$COLOR_ATTRIB_BLINK$COLOR_ATTRIB_HOLD"

    echo -e $new_parameter
    return 0
}

alias COLOR_END="func_color_end"
function func_color_end() {
    local new_parameter="$COLOR_RESET"

    echo -e $new_parameter
    return 0
}

# --------------------------------------------------------------------------------
# test case
# --------------------------------------------------------------------------------

function func_test_color_all() {
    local color_format_parameter=""
    local color_to_test=""

    echo "# -------------------------------------------------------------------------------"
    echo "# test color fg"
    echo "# -------------------------------------------------------------------------------"

    color_to_test=$COLOR_TYPE_FG_BLACK$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_BLACK"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_RED$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_RED"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_GREEN$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_GREEN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_YELLOW$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_YELLOW"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_BLUE$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_BLUE"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_MAGENTA$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_MAGENTA"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_CYAN$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_CYAN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_GRAY$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_GRAY"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_DEFAULT_COLOR$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_DEFAULT_COLOR"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_DARK_GRAY$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_DARK_GRAY"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_RED$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_RED"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_GREEN$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_GREEN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_YELLOW$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_YELLOW"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_BLUE$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_BLUE"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_MAGENTA$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_MAGENTA"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_LIGHT_CYAN$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_LIGHT_CYAN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_FG_WHITE$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_FG_WHITE"
    PRINT_ENTER_KEY

    echo "# -------------------------------------------------------------------------------"
    echo "# test color bg"
    echo "# -------------------------------------------------------------------------------"

    color_to_test=$COLOR_TYPE_BG_BLACK$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_BLACK"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_RED$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_RED"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_GREEN$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_GREEN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_YELLOW$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_YELLOW"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_BLUE$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_BLUE"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_MAGENTA$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_MAGENTA"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_CYAN$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_CYAN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_GRAY$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_GRAY"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_DEFAULT_COLOR$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_DEFAULT_COLOR"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_DARK_GRAY$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_DARK_GRAY"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_RED$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_RED"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_GREEN$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_GREEN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_YELLOW$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_YELLOW"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_BLUE$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_BLUE"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_MAGENTA$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_MAGENTA"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_LIGHT_CYAN$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_LIGHT_CYAN"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_TYPE_BG_WHITE$COLOR_TYPE_FG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_TYPE_BG_WHITE"
    PRINT_ENTER_KEY

    echo "# -------------------------------------------------------------------------------"
    echo "# test color attrib set"
    echo "# -------------------------------------------------------------------------------"

    color_to_test=$COLOR_ATTRIB_BOLD$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_ATTRIB_BOLD"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_ATTRIB_DIM$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_ATTRIB_DIM"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_ATTRIB_UNDER_LINE$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_ATTRIB_UNDER_LINE"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_ATTRIB_BLINK$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_ATTRIB_BLINK"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_ATTRIB_REVERSE$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_ATTRIB_REVERSE"
    PRINT_ENTER_KEY

    color_to_test=$COLOR_ATTRIB_HIDDEN$COLOR_TYPE_BG_DEFAULT_COLOR
    color_format_parameter="$color_to_test%s$COLOR_RESET"
    func_parameter_forwarding_to_printf "$color_format_parameter" "COLOR_ATTRIB_HIDDEN"
    PRINT_ENTER_KEY

    return 0
}

function func_test_color_print() {
    # test all kind of color print
    func_test_color_all

    echo "# -------------------------------------------------------------------------------"
    echo "# 1 test print color text"
    echo "# -------------------------------------------------------------------------------"
    PRINT_BLACK "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_RED "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_GREEN "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_YELLOW "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_BLUE "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_MAGENTA "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_CYAN "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    PRINT_WHITE "current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY

    echo "# -------------------------------------------------------------------------------"
    echo "# 2 test color print interface by printf"
    echo "# -------------------------------------------------------------------------------"
    PRINT_INFO "this is a info text : current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_WARN "this is a warning text"
    PRINT_ERR "this is a error text"

    echo "# -------------------------------------------------------------------------------"
    echo "# 3 test color print interface by echo"
    echo "# -------------------------------------------------------------------------------"
    ECHO_INFO "this is a normal text : current user id = " $(id -u) ", user name = " $(id -u -n) "msg have space"
    ECHO_WARN "this is a warning text"
    ECHO_ERR "this is a error text"

    echo "# -------------------------------------------------------------------------------"
    echo "# 4 test color begin and color end, between them, can call print or echo print color text"
    echo "# -------------------------------------------------------------------------------"

    COLOR_BEGIN_INFO
    echo -e "* this is a info text"
    printf "** this is a info text : current user id = %d, user name = %s, msg = %s" "$(id -u)" "$(id -u -n)"  "msg have space"
    PRINT_ENTER_KEY
    echo -e "*** before do COLOR_END, when finish a row, don't use /n on the end"
    COLOR_END

    COLOR_BEGIN_WARN
    printf "* this is a warning text : current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    PRINT_ENTER_KEY
    echo -e "** this is a warning text"
    echo -e "*** before do COLOR_END, when finish a row, don't use /n on the end"
    COLOR_END

    COLOR_BEGIN_ERR
    echo -e "* this is a error text"
    echo -e "** before do COLOR_END, when finish a row, don't use /n on the end"
    printf "*** this is a error text : current user id = %d, user name = %s, msg = %s" $(id -u) "$(id -u -n)" "msg have space"
    COLOR_END

    printf "test end"
    PRINT_ENTER_KEY
}

# --------------------------------------------------------------------------------
# __SH_COLOR_DEFINE_END__

# @file installer_manager.sh

# -----------------------------------------------------------------------------
# for include other sub sh, calc the dir and the parent dir
# -----------------------------------------------------------------------------
absolute_sh_path_name=$(readlink -f "$0") # e.g. /home/dev/make_linux_installation_program.sh

absolute_sh_path=$(dirname "$absolute_sh_path_name") # e.g. /home/dev
absolute_sh_parent_path=$(dirname "$absolute_sh_path") # e.g. /home

PROG_NAME="installer manager shell script"
PROG_VER="1.0.0.6"
PROG_TIME="2018-2-27 10:57"

#
# err code define
#
declare -r G_ERR_CODE_OK=0
declare -r G_ERR_CODE_BASE=1
declare -r G_ERR_CODE_ERR=$(echo "scale=4; $G_ERR_CODE_BASE + 0" | bc)
declare -r G_ERR_CODE_FILE_NOT_EXIST=$[ $G_ERR_CODE_BASE + 1 ]

function func_is_file_exist() {
    local rc=$G_ERR_CODE_FILE_NOT_EXIST

    if { [ -f "$1" ] || [ -d "$1" ]; }
    then
        rc=$G_ERR_CODE_OK
    fi

    return $rc
}

function func_delete_file() {
    local rc=$G_ERR_CODE_ERR

    func_is_file_exist "$1"
    rc=$?
    if [ $G_ERR_CODE_OK -ne $rc ]
    then
        PRINT_ERR "$1 not exist"
    else
        rm -rf "$1"
        rc=$?
    fi

    return $rc
}

# @fn func_create_tmp_file
# @param 1 prefix_name
# @param 2 postfix_name
# @return /tmp/prefix_name_xxx.postfix_name
function func_create_tmp_file() {
    local rc=$G_ERR_CODE_OK
    local prefix_name=$1
    local postfix_name=$2
    local tmp_path_name=""

    if [ -z $prefix_name ]
    then
        prefix_name="tmp_file"
    fi

    if [ -z $postfix_name ]
    then
        postfix_name="tmp"
    fi

    tmp_path_name=$(mktemp ${TMPDIR:-/tmp/}"$prefix_name"_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.$postfix_name)
    echo "$tmp_path_name"

    return $rc
}

# @fn func_create_tmp_file
# @param 1 dir_base_name
# @return /tmp/dir_base_name_xxx
function func_create_tmp_dir() {
    local rc=$G_ERR_CODE_OK
    local dir_base_name=$1
    local tmp_path_name=""

    if [ -z $dir_base_name ]
    then
        dir_base_name="tmp_dir"
    fi

    tmp_path_name=$(mktemp -d ${TMPDIR:-/tmp/}"$dir_base_name"_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)
    echo "$tmp_path_name"

    return $rc
}

function main() {
    declare -r local DIR_INSTALL_ROOT="install_root" # 安装初始目录
    declare -r local TEMP_TAR_FILE_NAME="media_for_install.tar"
    declare -r local TEMP_LOG_FILE_NAME="intall.log"
    declare -r local START_SH_FILE_NAME="interface/install.sh"

    local rc=0
    local temp_dir=""
    local temp_dir_install_root=""
    local temp_file_path_name=""
    local temp_file_install_log=""
    local start_sh_file_path_name=""

    clear

    # show version
    PRINT_NOTIFY "[%s] [%s] [%s] %s\n" "$PROG_NAME" "$PROG_VER" "$PROG_TIME" "running..."

    temp_dir=$(func_create_tmp_dir "install_manager")
    PRINT_INFO "tmp dir = [$temp_dir]"

    temp_dir_install_root="$temp_dir/$DIR_INSTALL_ROOT"
    PRINT_INFO "temp_dir_install_root=$temp_dir_install_root"
    # when tar xzvf x.sh -C the_dir_to_un_tar, the the_dir_to_un_tar must exist
    mkdir -p $temp_dir_install_root

    start_sh_file_path_name="$temp_dir_install_root/$START_SH_FILE_NAME"

    temp_file_path_name="$temp_dir/$TEMP_TAR_FILE_NAME"
    PRINT_INFO "temp_file_path_name=$temp_file_path_name"

    temp_file_install_log="$temp_dir/$TEMP_LOG_FILE_NAME"
    PRINT_INFO "temp_file_err_log=$temp_file_install_log"
    echo "install begin" > $temp_file_install_log

      sed -n -e '1,/^# __INSTALLER_MANAGER_SH_END__/!p' $0 > "$temp_file_path_name" 2>$temp_file_install_log
    # sed -n -e '1,/^# __INSTALLER_MANAGER_SH_END__/!p' /home/dev/demo/interface/installer_manager.sh

    printf "tar xzvf $temp_file_path_name -C $temp_dir_install_root 2>>$temp_file_install_log 1>>$temp_file_install_log\n" >>$temp_file_install_log
    tar xzvf $temp_file_path_name -C $temp_dir_install_root 2>>$temp_file_install_log 1>>$temp_file_install_log
    rc=$?
    if [ $G_ERR_CODE_OK -ne $rc ]
    then
        PRINT_ERR "unzip tar file failed"
        cat $temp_file_install_log
    else
        PRINT_NOTIFY "unzip tar file ok"

        COLOR_BEGIN_INFO
        cd $temp_dir_install_root
        printf "dir [%s] : \n" $(pwd)
        ls -l -h -p
        COLOR_END

        # run start sh
        func_is_file_exist $start_sh_file_path_name
        rc=$?
        if [ $G_ERR_CODE_OK -eq $rc ]
        then
            # tmp_dir/install_root/interface/install.sh
            chmod 775 $start_sh_file_path_name
            # 由用户提供的安装脚本接管剩下的安装任务
            $start_sh_file_path_name

            # if no any error, delete temp dir for installer
            func_delete_file "$temp_dir"
        else
            PRINT_WARN "can't find the start shell script"
        fi
    fi
}

main
exit 0

# --------------------------------------------------------------------------------
# __INSTALLER_MANAGER_SH_END__
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值