数组中的Bash检查元素用于另一个数组中的元素

Dan*_*and 5 arrays bash function

我找到了这个很酷的Bash函数,用于检查数组是否包含一个元素:

CONTAINS_ELEMENT(){
  local e
  for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
  return 1
}
Run Code Online (Sandbox Code Playgroud)

以下是它的用法示例:

if CONTAINS_ELEMENT $element "${array[@]}"; then
... 
fi
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法重写这个函数,以便它可以检查数组中的任何值是否等于其他数组的任何值,而不只是检查一个单独的值,因为它正确吗?

Tru*_*ueY 3

已更正#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
Run Code Online (Sandbox Code Playgroud)

输出:

Contains arr1 arr3
Run Code Online (Sandbox Code Playgroud)

其他方法可能是定义一些分隔字符并连接第一个散列。然后搜索匹配的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
Run Code Online (Sandbox Code Playgroud)

输出:

ContainsRe arr1 arr3
Run Code Online (Sandbox Code Playgroud)