O script abaixo permite que você escreva um monte de vlans em uma matriz e, em seguida, quero usá-lo para remover outra parte da configuração em relação a uma linha declarada "dhcp snooping"
$ cat nm
#!/bin/bash
echo "enter old vlans"
while read line
do
oldvlans=("${oldvlans[@]}" $line)
done
delete=790
for del in ${delete[@]}
do
oldvlans=("${oldvlans[@]/$del}")
done
printf -v joinedoldvlans '%s,' "${oldvlans[@]}"
echo "no ip dhcp snooping vlan ${joinedoldvlans%,}"
$ ./nm
enter old vlans
119
790
999
no ip dhcp snooping vlan 119,,999
O problema que tenho é a formatação agora. Eu queria que a saída na última linha ficasse assim:
no ip dhcp snooping vlan 119,999
Mas não tenho certeza de como consertar isso.
Bem,
oldvlans=("${oldvlans[@]/$del}")
na verdade não remove nenhum elemento da matriz, apenas remove a string fornecida dos elementos existentes. Além disso, também corresponderia à string fornecida no meio de um elemento, por exemplo, tendodel=790
, se transformaria1790
em apenas1
.Não acho que haja uma maneira melhor de filtrar os valores da matriz do que criar uma nova:
Obviamente, se você tiver uma lista de valores que deseja remover, precisará pelo menos de um teste para ver se existe um determinado elemento na matriz, e isso também não é simples no Bash.
Talvez você possa usar uma matriz esparsa, com os dados ativos nas chaves/índices :
(Você também pode usar um array associativo, mas as chaves sairiam em uma ordem indeterminada.)
Fazer coisas assim é algo que pode ser melhor feito em alguma outra linguagem de programação, IMO.