用户工具

站点工具


侧边栏

[侧边栏]

侧栏编辑 后台管理
GIT仓库
老web
C++Reference
快速笔记 笔记浏览

working:7_随笔随记:未整理:shell:argument_options_paser.sh


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


working/7_随笔随记/未整理/shell/argument_options_paser.sh.txt · 最后更改: 2021/06/11 03:44 由 wenliang