You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:05:42