function ARGUMENT_LOADING() {
# ARGUMENT_RULE: NAME | KEYWORD | VAULE_NUM | INFO(说明)
function ARGUMENT_RULE_DEFINE() {
ARGUMENT_HANDLE_RULE_NUM=${#ARGUMENT_HANDLE_NAME[*]}
ARGUMENT_HANDLE_NAME[${ARGUMENT_HANDLE_RULE_NUM}]=${1}
ARGUMENT_HANDLE_KEYWORD[${ARGUMENT_HANDLE_RULE_NUM}]=${2}
ARGUMENT_HANDLE_OPTION_NUM[${ARGUMENT_HANDLE_RULE_NUM}]=$[${3}]
ARGUMENT_HANDLE_INFO[${ARGUMENT_HANDLE_RULE_NUM}]=${@:4}; # 如果有空格, 需要\"
}
function ARGUMENT_RULE_DESTROY() {
unset ARGUMENT_HANDLE_NAME ARGUMENT_HANDLE_KEYWORD ARGUMENT_HANDLE_OPTION_NUM ARGUMENT_HANDLE_INFO ARGUMENT_HANDLE_RULE_NUM;
}
function ARGUMENT_RULE_INFO() {
local KEYWORD_LEN_MAX=0
for((RULE_INDEX=0;RULE_INDEX<${ARGUMENT_HANDLE_RULE_NUM};RULE_INDEX++)); do
local THIS_KEYWORD_MORE[$RULE_INDEX]=${ARGUMENT_HANDLE_KEYWORD[$RULE_INDEX]}
for((RULE_INDEX2=1;RULE_INDEX2<=${ARGUMENT_HANDLE_OPTION_NUM[$RULE_INDEX]};RULE_INDEX2++)); do
local THIS_KEYWORD_MORE[$RULE_INDEX]="${THIS_KEYWORD_MORE[$RULE_INDEX]} <option${RULE_INDEX2}>"
done
[ ${KEYWORD_LEN_MAX} -lt ${#THIS_KEYWORD_MORE[$RULE_INDEX]} ] && local KEYWORD_LEN_MAX=${#THIS_KEYWORD_MORE[$RULE_INDEX]}
done
printf "Options:\n"
for((RULE_INDEX=0;RULE_INDEX<${ARGUMENT_HANDLE_RULE_NUM};RULE_INDEX++)); do
printf " %-*s %s\n" $KEYWORD_LEN_MAX "${THIS_KEYWORD_MORE[$RULE_INDEX]}" "${ARGUMENT_HANDLE_INFO[$RULE_INDEX]}"
done
}
function ARGUMENT_OPTIONS_UNSET() {
for THIS_NAME in ${ARGUMENT_HANDLE_NAME[*]}; do eval unset ${THIS_NAME}; done;
}
function ARGUMENT_OPTIONS_PASER() {
while ([ "$1" != "" ]); do
for((RULE_INDEX=0;RULE_INDEX<${ARGUMENT_HANDLE_RULE_NUM};RULE_INDEX++)); do
if [ "$1" == "${ARGUMENT_HANDLE_KEYWORD[$RULE_INDEX]}" ] ; then
eval ${ARGUMENT_HANDLE_NAME[$RULE_INDEX]}=1
for((RULE_INDEX2=0;RULE_INDEX2<${ARGUMENT_HANDLE_OPTION_NUM[$RULE_INDEX]};RULE_INDEX2++)); do
eval ${ARGUMENT_HANDLE_NAME[$RULE_INDEX]}[${RULE_INDEX2}]=\"$2\"; shift
done
break
fi
done
shift
done
}
function ARGUMENT_OPTIONS_INFO() {
local NAME_LEN_MAX=0; # 字符对齐最大值
for((RULE_INDEX=0;RULE_INDEX<${ARGUMENT_HANDLE_RULE_NUM};RULE_INDEX++)); do
[ ${NAME_LEN_MAX} -lt ${#ARGUMENT_HANDLE_NAME[$RULE_INDEX]} ] && local NAME_LEN_MAX=${#ARGUMENT_HANDLE_NAME[$RULE_INDEX]}
done ; local NAME_LEN_MAX=$[ ${NAME_LEN_MAX} + 5 ]
printf "Options Value:\n"
for((RULE_INDEX=0;RULE_INDEX<${ARGUMENT_HANDLE_RULE_NUM};RULE_INDEX++)); do
local match_cnt=0; #去除重复
for((RULE_INDEX2=0;RULE_INDEX2<${ARGUMENT_HANDLE_RULE_NUM};RULE_INDEX2++)); do
[ "${ARGUMENT_HANDLE_NAME[$RULE_INDEX]}" == "${ARGUMENT_HANDLE_NAME[$RULE_INDEX2]}" ] && local match_cnt=$[ ${match_cnt} + 1 ]
done; [ "$match_cnt" -gt "1" ] && continue
[ "${ARGUMENT_HANDLE_OPTION_NUM[$RULE_INDEX]}" -gt "1" ] && for((RULE_INDEX2=0;RULE_INDEX2<${ARGUMENT_HANDLE_OPTION_NUM[$RULE_INDEX]};RULE_INDEX2++)); do
printf " %-*s = %s\n" $NAME_LEN_MAX "${ARGUMENT_HANDLE_NAME[$RULE_INDEX]}[$RULE_INDEX2]" "$(eval echo \${${ARGUMENT_HANDLE_NAME[$RULE_INDEX]}[$RULE_INDEX2]})"
done
[ "${ARGUMENT_HANDLE_OPTION_NUM[$RULE_INDEX]}" -le "1" ] && \
printf " %-*s = %s\n" $NAME_LEN_MAX "${ARGUMENT_HANDLE_NAME[$RULE_INDEX]}" "$(eval echo \$${ARGUMENT_HANDLE_NAME[$RULE_INDEX]})"
done
}
}
# THIS_NAME : $(eval echo \${${1}_NAME[$RULE_INDEX]})
# RULE_NUM : $(eval echo \${#${1}_NAME[*]})
function ARGUMENT_TEST()
{
#ARGUMENT_RULE_DEFINE HANDLE 参数的变量名 命令参数 参数数量 说明
ARGUMENT_RULE_DESTROY
ARGUMENT_RULE_DEFINE OPTIONS_HELP -none 0 测试ARGUMENT_RULE_DESTROY
ARGUMENT_RULE_INFO
ARGUMENT_RULE_DESTROY
ARGUMENT_RULE_DEFINE OPTIONS_HELP -h 0 Display this information.
ARGUMENT_RULE_DEFINE OPTIONS_TEST00 -a
ARGUMENT_RULE_DEFINE OPTIONS_TEST01 -b 1 1个参数
ARGUMENT_RULE_DEFINE OPTIONS_TEST02 -c 2 2个参数
ARGUMENT_RULE_DEFINE OPTIONS_TEST03 -d 3 4个参数
ARGUMENT_RULE_DEFINE OPTIONS_TEST04 --e 2 1个参数
ARGUMENT_RULE_DEFINE OPTIONS_TEST05_LARGE123456789 --x
ARGUMENT_RULE_DEFINE OPTIONS_TEST10 -1 0 abc .
ARGUMENT_RULE_DEFINE OPTIONS_TEST11 -2
ARGUMENT_RULE_DEFINE OPTIONS_TEST12 -3
ARGUMENT_RULE_DEFINE OPTIONS_TEST13 -4
ARGUMENT_RULE_DEFINE OPTIONS_TEST14 -5
ARGUMENT_RULE_DEFINE OPTIONS_TEST15 -6
ARGUMENT_RULE_DEFINE OPTIONS_TEST16 -7
ARGUMENT_RULE_DEFINE OPTIONS_TEST17 -8
ARGUMENT_RULE_DEFINE OPTIONS_TEST18 -9
ARGUMENT_RULE_DEFINE OPTIONS_TEST19 -10
ARGUMENT_RULE_INFO
ARGUMENT_OPTIONS_INFO
ARGUMENT_OPTIONS_PASER -h -a A B C D -b A1 B1 C1 D1 -c A2 B2 C2 D2 -d A3 B3 C3 D3 --e "Z1 Z2 Z3 Z4 Z5 Z6"
ARGUMENT_OPTIONS_PASER -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
ARGUMENT_OPTIONS_PASER --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33 --z 11 22 33
ARGUMENT_OPTIONS_PASER -A1234567890_1 -A1234567890_2 -A1234567890_3
ARGUMENT_OPTIONS_INFO
ARGUMENT_OPTIONS_UNSET
ARGUMENT_OPTIONS_INFO
ARGUMENT_RULE_DESTROY
}
function test1()
{
ARGUMENT_LOADING
for((INDEX=0;INDEX<100;INDEX++)); do
ARGUMENT_TEST
done
}
function test2()
{
function ARGUMENT_OPTIONS_PASER2()
{
while ([ "$1" != "" ]); do
if [ "$1" == "-1" ] ; then OPTIONS_TEST10=1;fi
if [ "$1" == "-2" ] ; then OPTIONS_TEST11=1;fi
if [ "$1" == "-3" ] ; then OPTIONS_TEST12=1;fi
if [ "$1" == "-4" ] ; then OPTIONS_TEST13=1;fi
if [ "$1" == "-5" ] ; then OPTIONS_TEST14=1;fi
if [ "$1" == "-6" ] ; then OPTIONS_TEST15=1;fi
if [ "$1" == "-7" ] ; then OPTIONS_TEST16=1;fi
if [ "$1" == "-8" ] ; then OPTIONS_TEST17=1;fi
if [ "$1" == "-9" ] ; then OPTIONS_TEST18=1;fi
if [ "$1" == "-10" ] ; then OPTIONS_TEST19=1;fi
shift
done
}
for((INDEX=0;INDEX<100;INDEX++)); do
ARGUMENT_OPTIONS_PASER2 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
ARGUMENT_OPTIONS_PASER2 -h -a A B C D -b A1 B1 C1 D1 -c A2 B2 C2 D2 -d A3 B3 C3 D3 --e "Z1 Z2 Z3 Z4 Z5 Z6"
done
}
if [ "$1" == "1" ] ; then
ARGUMENT_LOADING; time ARGUMENT_TEST; ARGUMENT_RULE_INFO ARGUMENT_HANDLE; ARGUMENT_OPTIONS_INFO ARGUMENT_HANDLE; exit
fi
#ARGUMENT_LOADING; ARGUMENT_TEST
time test1
time test2
time test1
time test2