Prefiro criar uma nova lista e substituir uma antiga por uma nova:
nodes="127.0.0.1 1.2.3.4 1.2.3.4 "
nodes_out=
for node in $nodes
do
ping -c 1 $node >/dev/null 2>&1 && nodes_out+=$node
done
nodes=$nodes_out
Eu escrevi um comando que gera uma lista de nomes de host, por exemplo, :
clab148node11
clab148node12
clab148node15
clab148node16
Agora, gostaria de remover os nós que não respondem ao ping. Por enquanto eu tenho algo assim:
for node in $nodes
do
result=$(ping -c 1 $node; echo $?)
done
Agora, como removo nós que possuem $result
diferente de 0?
como @manatwork disse, parece mais simples e seguro construir uma nova lista com os nós válidos.
No entanto, como "$ nodes" é avaliado antes da primeira iteração do loop for, deve ser possível alterá-lo durante o mesmo loop:
$ nodes="127.0.0.1 1.2.3.4 1.2.3.4 "
$ for node in $nodes; do
result=$(ping -c 1 $node >/dev/null 2>/dev/null; echo $?);
if [ "$result" -ne 0 ];
then nodes=$(echo $nodes | sed -e "s/ *$node */ /");
fi;
echo result=$result node=$node nodes=$nodes ;
done ;
Aviso: meu sed substituir [space]$node[space]
ou $node[space]
ou [space]$node
para funcionar em todos os casos, dependendo da posição de $node
na lista $nodes
(se estiver no meio, ou no primeiro ou no último elemento, espaço (s) antes e depois de estar presente ou não). E só substitui 1 ocorrência por vez, mas você pode adicionar um% final/g
para se livrar de todas as ocorrências de uma só vez.
Esta saída:
result=0 node=127.0.0.1 nodes=127.0.0.1 1.2.3.4 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1
Outra opção é simplesmente usar um grep inverso para encontrar todas as ocorrências na lista não correspondentes ao host:
for node in $nodes
do
if ! 'ping -c 1 $node > /dev/null 2>&1'; then
nodes="'echo \"$nodes\" | grep -v \"$node\"'"
fi
done
Tags bash shell shell-script