更正#3
试试下面的代码。ArrContains
取两个参数,两个数组的名称。它创建一个临时散列lArr1
,然后检查散列中是否有任何元素lArr2
。这样for
可以避免嵌入的循环。
#!/usr/bin/bash
ArrContains(){
local lArr1 lArr2
declare -A tmp
eval lArr1=("\"\${$1[@]}\"")
eval lArr2=("\"\${$2[@]}\"")
for i in "${lArr1[@]}";{ ((++tmp['$i']));}
for i in "${lArr2[@]}";{ [ -n "${tmp[$i]}" ] && return 0;}
return 1
}
arr1=("a b" b c)
arr2=(x 'b c' e)
arr3=(q a\ b y)
ArrContains arr1 arr2 && echo Contains arr1 arr2
ArrContains arr1 arr3 && echo Contains arr1 arr3
输出:
Contains arr1 arr3
其他方法可能是定义一些分隔字符并连接第一个哈希。然后搜索匹配的SEPitemSEP
字符串。
ArrContainsRe(){
local lArr1 lArr2 tmp
eval lArr1=("\"\${$1[@]}\"")
printf -v tmp ",%s" "${lArr1[@]}";
tmp="$tmp,"
eval lArr2=("\"\${$2[@]}\"")
for i in "${lArr2[@]}";{ [[ $tmp =~ ,$i, ]] && return 0;}
return 1
}
...
ArrContainsRe arr1 arr2 && echo ContainsRe arr1 arr2
ArrContainsRe arr1 arr3 && echo ContainsRe arr1 arr3
输出:
ContainsRe arr1 arr3