如何在Bash的外层for循环中遍历多组关联数组
Bash中动态遍历对应子数组的解决方案
你当前的代码问题在于内层循环硬编码了NETWORK数组,导致无论外层循环遍历到哪个package值,都只会遍历NETWORK的元素。要实现根据外层变量动态引用对应数组,有两种常用方法:
方法1:使用间接变量引用(兼容bash 3+)
利用bash的间接引用语法${!var},可以通过变量值动态引用另一个变量(包括数组)。修改你的循环代码如下:
packages=("NETWORK" "FILE_SYSTEM") NETWORK=(DBMS_LDAP UTL_INADDR UTL_TCP UTL_MAIL UTL_SMTP UTL_DBWS UTL_ORAMTS UTL_HTTP HTTPURITYPE) FILE_SYSTEM=(DBMS_ADVISOR DBMS_LOB UTL_FILE) for package in "${packages[@]}"; do echo "Ensure 'EXECUTE' is revoked from 'PUBLIC' on $package Packages" # 构造数组引用字符串 subarray_ref="${package}[@]" # 使用间接引用遍历对应数组 for i in "${!subarray_ref}"; do /bin/echo -e "Current setting for $i:" RESULT=$(grep -Ei "^PUBLIC;.*$i;.*EXECUTE.*" file.txt) if [[ -z "$RESULT" ]]; then /bin/echo -e "Setting for $i is properly configured.\n" else /bin/echo -e "[!] This is not recommended setting! EXECUTE privilege should not be enabled for $i\n" fi done done
关键说明:
subarray_ref="${package}[@]":将当前package的值拼接成数组的引用格式(比如当package=FILE_SYSTEM时,这个变量的值是FILE_SYSTEM[@])"${!subarray_ref}":间接引用语法,bash会把subarray_ref的值当作变量名,展开对应的数组所有元素,这样就实现了动态遍历对应子数组。
方法2:使用关联数组(bash 4+推荐)
如果你的环境是bash 4及以上,可以用关联数组来更清晰地组织主数组和子数组的映射关系:
# 声明关联数组,键是主分类,值是对应子数组的名称 declare -A package_map=( ["NETWORK"]="NETWORK_SUB" ["FILE_SYSTEM"]="FS_SUB" ) # 定义子数组 NETWORK_SUB=(DBMS_LDAP UTL_INADDR UTL_TCP UTL_MAIL UTL_SMTP UTL_DBWS UTL_ORAMTS UTL_HTTP HTTPURITYPE) FS_SUB=(DBMS_ADVISOR DBMS_LOB UTL_FILE) # 遍历关联数组的键 for package in "${!package_map[@]}"; do echo "Ensure 'EXECUTE' is revoked from 'PUBLIC' on $package Packages" # 获取对应子数组的引用 subarray_ref="${package_map[$package]}[@]" for i in "${!subarray_ref}"; do /bin/echo -e "Current setting for $i:" RESULT=$(grep -Ei "^PUBLIC;.*$i;.*EXECUTE.*" file.txt) if [[ -z "$RESULT" ]]; then /bin/echo -e "Setting for $i is properly configured.\n" else /bin/echo -e "[!] This is not recommended setting! EXECUTE privilege should not be enabled for $i\n" fi done done
关键说明:
declare -A用于声明关联数组,让你可以用字符串作为键来映射值- 这种方式更适合分类较多的场景,结构更清晰,避免变量名冲突。
内容的提问来源于stack exchange,提问作者RAID
相关产品推荐
相关产品推荐

