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