修正済み#3
以下のコードを試してください。ArrContains
2 つの配列の名前である 2 つの引数を取ります。から一時的なハッシュを作成し、の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