A resposta curta para sua primeira pergunta é LIVECOUNT=$((LIVECOUNT+1))
. Esta expansão aritmética, mostrada por double parens: $ (()), para incrementar a variável LIVECOUNT por um cada vez que o comando ping retornar 0 para o sucesso.
A resposta curta para descobrir o número total de hosts é subtrair o endereço inferior ($ {2}) do endereço superior ($ {3}) e adicionar um para obter o total de hosts.
Então:
#!/bin/bash
CHECKING=${1}.
LIVEHOSTS=""
LIVECOUNT=0
TOTALHOSTS=$(($3 - $2 + 1))
for i in 'seq ${2} ${3}'
do
CHECKING="$CHECKING${i} "
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
LIVEHOSTS="$LIVEHOSTS \n ${1}.${i}"
LIVECOUNT=$((LIVECOUNT+1))
fi
done
echo ""
echo "Checking: $CHECKING"
echo ""
echo "Live hosts:"
echo -e "$LIVEHOSTS"
echo ""
echo "There were:"
echo "$LIVECOUNT alive hosts"
echo "$((TOTALHOSTS - $LIVECOUNT)) not alive hosts"
echo "found through the use of ping"
Observe o seguinte: $ CHECKING é uma string que começa com a sub-rede fornecida como parâmetro 1 $ {1} e, em seguida, adiciona o número do host atual $ {i} para cada iteração do loop do.
Por causa da forma como você tem este formato (com a linha "Checking:" à frente da linha "Live hosts:") parecia mais fácil manter os hosts ao vivo em uma string (semelhante a $ CHECKING), então é isso que $ LIVEHOSTS é.
$ LIVEHOSTS e $ LIVECOUNT são inicializados em branco e zero para deixar claro o que está acontecendo; isso não é estritamente falando, necessário.
Observe o uso de echo -e quando $ LIVEHOSTS é produzido. Isso é para fazer o \ n funcionar como uma nova linha.
EDIT: Para mostrar qual IP está atualmente sendo verificado e não uma lista no final, substitua CHECKING="$CHECKING${i} "
por echo "Checking $CHECKING${i}"
e exclua ou comente a linha echo "Checking: $CHECKING"
. Como o echo
é dentro do loop do
, ele será impresso em cada passagem, usando o valor atual de $ i. (Esta é a mesma coisa que @slm apontou sobre seu uso de echo "Live hosts"
em seu script original.)
Espero que isso ajude.