如何简化Bash中遍历list_0至list_99等多个编号数组的代码?
批量遍历命名规律的数组
你有一系列按list_0到list_99命名的数组:
list_0=(1 2 3 4 5 6) list_1=(7 8 9) list_2=(22 7 34 88) # ... 省略中间数组 list_99=(23 67 80)
当前需要手动逐个列出数组名才能遍历所有元素,这里提供几种更简便的实现方式:
方法1:间接扩展(兼容多数Bash版本)
通过循环构造数组名,利用Bash的间接扩展特性获取数组内容:
# 遍历每个数组 for ((x=0; x<=99; x++)) do arr_name="list_$x" # 遍历当前数组的所有元素 for num in "${!arr_name[@]}" do echo "${!arr_name[$num]}" done done
如果需要先收集所有元素再统一处理,可以先把元素存入总数组:
all_elements=() for ((x=0; x<=99; x++)) do arr_name="list_$x" all_elements+=("${!arr_name[@]}") done # 遍历总数组 for num in "${all_elements[@]}" do echo "$num" done
方法2:Nameref(Bash 4.3+)
使用Bash的Nameref特性直接关联目标数组,写法更直观:
for ((x=0; x<=99; x++)) do # 定义引用变量指向当前数组 declare -n arr="list_$x" # 直接遍历数组元素 for num in "${arr[@]}" do echo "$num" done # 解除引用(可选,避免后续变量冲突) unset -n arr done
方法3:eval拼接(慎用)
如果只是想快速简化原循环写法,可以用eval生成遍历语句,但要注意仅在数组内容安全的场景使用(避免特殊字符导致的问题):
eval "for num in \${list_{0..99}[@]}; do echo \$num; done"
内容的提问来源于stack exchange,提问作者Adrian Oprea
相关产品推荐
相关产品推荐

