Eu não sei porque seu código não funciona para as entradas apresentadas. Ele faz no meu sistema em ksh.
Mas seu código original tem um problema: a parte condicional i<${#aa[@]}
é frágil - desde ${#aa[@]}
, ou seja, o tamanho da matriz é diminuído após cada unset
- mas os elementos da matriz a seguir não são deslocados automaticamente para a esquerda. Para o seu exemplo
45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12
isso não faz diferença - mas faria diferença para - digamos:
45.32.3.5 255.0.0.0 19.23.2.12 255.255.255.0
Eu melhorei o código com relação a esse problema (observe a atribuição antes da entrada do loop). Eu também eliminei um loop interno (usando um array associativo) que melhora o tempo de execução de quadrático para linear:
$ cat x.sh
exibe:
aa=(45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12)
bb=([255.0.0.0]=1 [255.255.255.0]=1)
print Size of input ${#aa[*]}
print Size of exclude list ${#bb[*]}
n=${#aa[*]}
for ((i=0; i<$n; ++i))
do
if [[ ${bb[${aa[i]}]} ]]
then
print Removing element with index $i: ${aa[i]}
unset aa[i];
fi
print New size of input ${#aa[*]}
done
print Resulting size of input ${#aa[*]}
print Resulting elements ${aa[*]}
for ((i=0; i<$n; ++i))
do
print Index $i, Value 'a['$i']'=${aa[$i]}
done
Produz a seguinte saída no Fedora 17:
$ ksh x.sh
Size of input 4
Size of exclude list 2
New size of input 4
Removing element with index 1: 255.0.0.0
New size of input 3
Removing element with index 2: 255.255.255.0
New size of input 2
New size of input 2
Resulting size of input 2
Resulting elements 45.32.3.5 19.23.2.12
Index 0, Value a[0]=45.32.3.5
Index 1, Value a[1]=
Index 2, Value a[2]=
Index 3, Value a[3]=19.23.2.12