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

Bash中按索引前缀过滤关联数组元素的实现方法

Bash关联数组按索引前缀过滤的正确实现

要提取关联数组中索引以nidforusr开头的元素,先明确你现有代码的问题:

  • 第一个循环的${DATA[@]:nidforusr1:nidforusr*}属于语法错误,Bash数组切片语法仅适用于索引数组,无法用于关联数组的索引匹配。
  • 第二个循环中[[ "$i" == "nidforusr*" ]]用双引号包裹了模式,导致*被当作字面量字符,无法实现前缀匹配。

以下是几种正确的实现方案:

方案1:遍历所有索引并匹配前缀

通过${!DATA[@]}获取关联数组的所有索引,再用条件判断筛选前缀符合要求的键:

# 必须先声明关联数组
declare -A DATA
DATA[nidforusr1]='jamaica'
DATA[nidforusr2]='brasil'
DATA[nidforusr3]='janaina'
DATA[nidforusr4]='cebola'
DATA[nidforusr5]='batata' 
DATA[nidforbkp1]='ketchup'
DATA[pwforusr1]='sorvete'
DATA[pwforusr2]='google'
DATA[pwforusr3]='pesado'
DATA[pwforusr4]='maluco'
DATA[pwforusr5]='programador'
DATA[pwforbkp1]='macaco'
DATA[ipforusr1]='batata'
DATA[ipforusr2]='senha'
DATA[ipforusr3]='microfone'
DATA[ipforusr4]='passarinho'
DATA[ipforusr5]='abobora'
DATA[ipforbkp1]='caixa'

for key in "${!DATA[@]}"; do
    if [[ $key == nidforusr* ]]; then
        echo "${DATA[$key]}"
    fi
done

关键:[[ $key == nidforusr* ]]中不要给模式加双引号,这样*会作为通配符匹配任意后缀。

方案2:直接匹配索引模式(Bash 4.0+)

Bash 4.0及以上版本支持直接通过模式匹配关联数组的索引,用${!DATA[nidforusr*]}直接获取所有符合前缀的索引,无需遍历所有键:

declare -A DATA
# 数组赋值部分同上

for key in "${!DATA[nidforusr*]}"; do
    echo "${DATA[$key]}"
done

这种方式更高效,省去了额外的条件判断步骤。

方案3:用case语句匹配

如果习惯用case语法,也可以实现相同效果:

declare -A DATA
# 数组赋值部分同上

for key in "${!DATA[@]}"; do
    case "$key" in
        nidforusr*) echo "${DATA[$key]}" ;;
    esac
done

内容的提问来源于stack exchange,提问作者Yohrannes Santos Bigoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:10:50