Você recebe um erro porque está tentando fazer uma igualdade aritmética com valores de string.
Aqui estão duas maneiras de verificar se os elementos de dfArray
estão em dsmArray
set -A dfArray / /usr /var /tmp ...
set -A dsmArray /home /opt /usr ...
for a in "${dfArray[@]}"; do
in=false
for b in "${dsmArray[@]}"; do
if [[ $a == $b ]]; then
echo "$a is in dsmArray"
in=true
break
fi
done
$in || echo "$a is not in dsmArray"
done
/ is not in dsmArray
/usr is in dsmArray
/var is not in dsmArray
/tmp is not in dsmArray
... is in dsmArray
Ou, achatando o dsmArray e evitando o loop interno:
for a in "${dfArray[@]}"; do
# all quotes and spaces required below
if [[ " ${dsmArray[*]} " == *" $a "* ]]; then
echo "$a is in dsmArray"
else
echo "$a is not in dsmArray"
fi
done
/ is not in dsmArray
/usr is in dsmArray
/var is not in dsmArray
/tmp is not in dsmArray
... is in dsmArray
Esta solução é apresentada nesta parte: [[ " ${dsmArray[*]} " == *" $a "* ]]
-
%código%
- quando citado,
" ${dsmArray[*]} "
resulta em uma única string composta dos elementos individuais da matriz unidos no primeiro caractere de"${ary[*]}"
- o padrão de
$IFS
é de 3 caracteres: espaço, tabulação, nova linha - com as cotas iniciais e finais, obtemos a string
$IFS
- quando citado,
-
%código%
- dentro de colchetes duplos, o operador
" /home /opt /usr ... "
é na verdade um operador de correspondência de padrões, não estritamente igual a - nosso padrão é:
- zero ou mais caracteres, seguido por
- um espaço, seguido por
- o valor de
*" $a "*
, seguido por - um espaço, seguido por
- zero ou mais caracteres
- dentro de colchetes duplos, o operador
Portanto, para cada valor de ==
, verificamos se ela aparece como uma palavra separada por espaço na sequência $a
nivelada.
Isso é dividido com os elementos da matriz que podem conter espaços. Então você precisa atribuir um novo valor a dfArray
e as coisas ficam confusas (-er).
Para obter uma matriz de elementos comuns, eu faria
typeset -i n=0
set -A common
for a in "${dfArray[@]}"; do
if [[ " ${dsmArray[*]} " == *" $a "* ]]; then
let n+=1
common[n]=$a
fi
done
echo "common"
printf "%s\n" "${common[@]}"
echo "common with index"
typeset -i i=1
while (( i <= n )); do echo "$i ${common[i]}"; ((i+=1)); done
common
/usr
...
common with index
1 /usr
2 ...