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
相关产品推荐
相关产品推荐

