Bash脚本中如何判断两个字符串是否同时完整存在于同一数组
原代码错误原因
你写的代码存在三个核心问题,导致运行结果不符合预期:
- 直接展开数组变量
$test_array只会输出数组的第一个元素,无法覆盖数组所有内容,相当于只校验了第一个元素有没有匹配值 - 就算用
${test_array[*]}拼接所有元素做字符串匹配,也无法保证是完整元素匹配,比如数组中存在planning123时,匹配planning1也会误命中,不满足你的需求 - 匹配目标和需求不符:你需要校验的是
planning1、planning2两个值是否存在,原代码校验的是active和planning
正确实现方案
方案1:关联数组法(推荐,查询效率高,无匹配误差)
利用bash的关联数组做哈希查询,是校验数组完整成员的最稳妥方案,适合数组元素较多的场景:
#!/bin/bash # 定义给定的待查数组 target_array=("active" "planning" "delete") # 定义需要检查的两个字符串 check_str1="planning1" check_str2="planning2" # 声明关联数组用于存储元素存在标记 declare -A arr_index for item in "${target_array[@]}"; do arr_index["$item"]=1 done # 同时判断两个字符串是否都作为完整元素存在 if [[ ${arr_index["$check_str1"]} && ${arr_index["$check_str2"]} ]]; then echo "true" else echo "false" fi
上述代码运行后会输出false,因为planning1和planning2都不在给定的目标数组中,符合你的预期规则。
方案2:遍历比对法(兼容低版本bash)
如果你的环境不支持关联数组,可以用遍历匹配的方式实现,逻辑如下:
#!/bin/bash target_array=("active" "planning" "delete") check_str1="planning1" check_str2="planning2" # 封装元素存在性校验函数 check_exist() { local target="$1" shift for elem in "$@"; do [[ "$elem" == "$target" ]] && return 0 done return 1 } if check_exist "$check_str1" "${target_array[@]}" && check_exist "$check_str2" "${target_array[@]}"; then echo "true" else echo "false" fi
内容的提问来源于stack exchange,提问作者1DA16CS151_V.J.Harshita
相关产品推荐
相关产品推荐

