前言
写好的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__