在Bash函数的CASE解析阶段整合可选数组解析逻辑
优化Bash的multary函数参数解析逻辑
这个Bash函数用于向多个数组填充元素,调用语法如下:
multary OPTIONS ary1 ary2 ary3 "item1" "item2" marker "item3" marker "item4"
其中ary1、ary2、ary3为可选的目标数组参数。原函数在PART2部分单独处理数组参数的解析,现在需要简化参数读取逻辑,把PART2中的数组解析逻辑整合到处理位置参数的case分支中。
原函数代码
multary () { ## 传递多个数组,用标记分隔 ## 分隔标记 local dna="***" dnb="***" while (( $# > 0 )); do parg="$1" case "$parg" in ("-m1") dna="$2" ; shift 2 ;; ("-m2") dnb="$2" ; shift 2 ;; ("--") shift 1 ; break ;; (*) break ;; esac done ##==================================================== ## PART2:单独处理数组参数解析 if [[ "$(declare -p $1)" =~ "declare -a" ]]; then typeset -n _ary1="$1" _ary1=() ; shift 1 echo "_ary1 is an array" fi if [[ "$(declare -p $1)" =~ "declare -a" ]]; then typeset -n _ary2="$1" _ary2=() ; shift 1 echo "_ary2 is an array" fi if [[ "$(declare -p $1)" =~ "declare -a" ]]; then typeset -n _ary3="$1" _ary3=() ; shift 1 echo "_ary3 is an array" fi }
修改后的函数代码(整合数组解析到case阶段)
multary () { ## 传递多个数组,用标记分隔 ## 分隔标记 local dna="***" dnb="***" # 跟踪已处理的数组数量,最多支持3个 local ary_count=0 while (( $# > 0 )); do parg="$1" case "$parg" in ("-m1") dna="$2" ; shift 2 ;; ("-m2") dnb="$2" ; shift 2 ;; ("--") shift 1 ; break ;; (*) # 判断当前参数是否为已声明的数组,避免未声明参数报错 if [[ "$(declare -p "$parg" 2>/dev/null)" =~ "declare -a" ]] && (( ary_count < 3 )); then # 使用 nameref 关联目标数组并清空 typeset -n _ary="$parg" _ary=() echo "_ary$((ary_count+1)) is an array" ary_count=$((ary_count+1)) shift 1 else # 非数组参数,退出循环以处理后续元素和标记 break fi ;; esac done }
修改说明
- 新增
ary_count变量跟踪已处理数组数量,确保不超过原函数支持的3个数组上限。 - 将原PART2的数组判断逻辑移入
case默认分支:- 加入
2>/dev/null屏蔽参数未声明时的错误输出,增强鲁棒性。 - 若当前参数是数组且未达上限,就通过
typeset -n关联目标数组、清空数组后移动参数指针。
- 加入
- 遇到非数组参数时直接退出循环,与原逻辑保持一致,方便后续处理元素和分隔标记。
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

