I came over this cool Bash function for checking if an array contains an element:
CONTAINS_ELEMENT(){
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
Here is an example of it's usage:
if CONTAINS_ELEMENT $element "${array[@]}"; then
...
fi
My question is this: Is there a way to rewrite this function so that it can check if any value within an array is equal to any value withing the other array, and not just check for one single value as it corrently does?
To find the index of specified element in an array in Bash, use For loop to iterate over the index of this array. In the for loop body, check if the current element is equal to the specified element. If there is a match, we may break the For loop and we have found index of first occurrence of specified element.
In order to check whether every value of your records/array is equal to each other or not, you can use this function. allEqual() function returns true if the all records of a collection are equal and false otherwise. let's look at the syntax… const allEqual = arr => arr.
The =~ operator is a regular expression match operator. This operator is inspired by Perl's use of the same operator for regular expression matching.
CORRECTED#3
Try code bellow. ArrContains
take two arguments, the name of the two arrays. It creates a temporary hash from lArr1
and then check if any elements of lArr2
is in the hash. This way the embedded for
-loops can be avoided.
#!/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
Output:
Contains arr1 arr3
Other way could be to define some separation character and concatenate the first hash. Then search for matching the SEPitemSEP
string.
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
Output:
ContainsRe arr1 arr3
Loop inside loop:
#!/bin/bash
clear
arrA=("a" "b" "c" "d" "e" "f")
arrZERO=("c" "e") # must be turned to "0"
echo "arrA:"
echo ${arrA[@]}
echo ""
echo "arrZERO:"
echo ${arrZERO[@]}
for (( i=0; i < ${#arrA[@]}; i++ ))
do
for (( j=0; j < ${#arrZERO[@]}; j++ ))
do
if [[ ${arrA[$i]} = ${arrZERO[$j]} ]]; then
arrA[$i]="0"
fi
done
done
echo ""
echo "FINAL"
echo ${arrA[@]}
Terminal will show:
arrA:
a b c d e f
arrZERO:
c e
FINAL
a b 0 d 0 f
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With