netid=(10 20 30 40)
for i in "${netid[@]}"; do
out="iptables -I FORWARD -s 192.168.$i.0/24 -d "
for j in "${netid[@]}"; do
(( i == j )) && continue
out+="192.168.$j.0/24,"
done
out="${out%,} -j DROP"
printf '%s\n' "$out"
done
Este script Bash produz
iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.30.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.40.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.30.0/24 -j DROP
através de um loop duplo. O loop interno ignora as iterações em que a variável de loop é numericamente igual à variável de loop do loop externo para criar o efeito desejado.
Depois de ter a string em $out , você pode usar eval .
Como alternativa, evite eval :
netid=(10 20 30 40)
for i in "${netid[@]}"; do
sarg="192.168.$i.0/24"
darg=""
for j in "${netid[@]}"; do
(( i == j )) && continue
darg+="192.168.$j.0/24,"
done
darg="${darg%,}"
iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done
A substituição de variável ${parameter%word} removerá word do final de $parameter , então darg="${darg%,}" removerá a vírgula no final af $darg .
Atualização após pergunta no comentário:
A única coisa bash -específica sobre o que foi dito acima é o uso da matriz $netid , o operador += para anexar à string $darg e ((...)) . Podemos transformar isso em um script sh como este (aqui assumindo que $IFS ainda tenha seu valor padrão):
netid="10 20 30 40"
for i in $netid; do
sarg="192.168.$i.0/24"
darg=""
for j in $netid; do
[ "$i" -eq "$j" ] && continue
darg="${darg}192.168.$j.0/24,"
done
darg="${darg%,}"
iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done
Se você tiver uma lista separada de números que deseja inserir em $darg , use-a no loop interno no lugar de $netid . Deve ser uma sequência de números separados por espaços.