如何在Bash数组指定索引元素前搜索包含特定字符串的匹配项
Bash数组指定索引前模糊搜索实现方案
实现逻辑
基于Bash名称引用(nameref)特性实现,避免数组元素带空格/特殊字符时传参异常,支持自定义返回索引或元素值,默认返回匹配的元素本身。
完整代码实现
some_magic_function() { # 参数1:传入的数组名称 local -n _arr=$1 # 参数2:指定的终止索引(搜索范围为该索引之前的所有元素) local req_idx=$2 # 参数3:需要搜索的目标字符串 local search_str=$3 # 可选参数4:传index则返回匹配索引,默认返回匹配元素值 local return_type=${4:-value} # 边界校验:索引小于等于0时无前置元素,直接返回错误 if (( req_idx <= 0 )); then return 1 fi # 从数组头部向终止索引前一位遍历,找第一个匹配项 # 如需找最靠近终止索引的匹配项,将循环改为 for (( i=req_idx-1; i>=0; i-- )) 即可 for (( i=0; i<req_idx; i++ )); do # 模糊包含匹配,如需精确匹配可修改为 [[ ${_arr[$i]} == "$search_str" ]] if [[ ${_arr[$i]} == *"$search_str"* ]]; then if [[ $return_type == "index" ]]; then echo "$i" else echo "${_arr[$i]}" fi return 0 fi done # 无匹配项返回错误 return 1 }
使用示例
# 测试用动态数组 arr=('foo' 'bar' 'baz' 'qux') # 动态指定的终止索引,搜索范围为索引0、1、2的元素(对应值foo、bar、baz) req_index=3 # 示例1:搜索包含字符串"ba"的匹配项,默认返回元素值 search_res=$(some_magic_function arr "$req_index" "ba" || echo "Not found") echo "$search_res" # 输出结果:bar # 示例2:搜索包含字符串"ba"的匹配项,指定返回索引 search_idx=$(some_magic_function arr "$req_index" "ba" index || echo "Not found") echo "$search_idx" # 输出结果:1 # 示例3:搜索不存在的字符串,返回未找到 search_res=$(some_magic_function arr "$req_index" "test" || echo "Not found") echo "$search_res" # 输出结果:Not found
注意事项
- 该实现依赖Bash 4.3及以上版本,低版本Bash可将数组元素用
\0作为分隔符拼接后传入函数,再拆分处理避免空格异常 - 可根据实际需求调整匹配规则、遍历方向
内容的提问来源于stack exchange,提问作者shrihankp
相关产品推荐
相关产品推荐

