Uma solução um pouco mais simples é
for ((i=1; i<=5; i++))
do
read output
date >> "$output.txt"
printf "\nComeçando o teste de %s." "$output"
printf "\nTeste em andamento."
ping -c 10 -i 1 "$output" >> "$output.txt"
done < hosts.txt
Observe o < hosts.txt
no final da última linha, após o done
.
Isso abre hosts.txt
uma vez e apenas lê as primeiras cinco linhas dele.
Como mencionado por don_crissti, fazendo sed … hosts.txt | read output
no loop significa que você está lendo
o arquivo hosts.txt
cinco vezes.
Como o read output
é paralelo ao restante do loop
(não em um pipeline), o resto do código no loop
terá acesso ao valor de output
lido do arquivo.
Além disso, como também não destacou, você não precisa de touch
;
%código%
criará command >> file
se ainda não existir.
Observe que, se um dos seus arquivos file
já existe, este código irá anexar as novas informações a ele.
Se você quiser descartar dados antigos e começar do zero,
do hostname.txt
em vez de date > "$output.txt"
.
Tenha cuidado ao transmitir dados desconhecidos diretamente para date >> "$output.txt"
.
No caso (improvável?) De um dos seus "hostnames" ter um printf
,
seu código irá adulterar esse nome.
É melhor transmitir dados estrangeiros para %
(para imprimir uma string).
Você não diz se deseja ler apenas as cinco primeiras linhas
do arquivo %s
e depois parar,
ou se você quiser ler o arquivo inteiro,
e você sabe que são cinco linhas de comprimento.
Se você quiser ler o arquivo inteiro, apenas faça
while read output
do
date >> "$output.txt"
printf "\nComeçando o teste de %s." "$output"
printf "\nTeste em andamento."
ping -c 10 -i 1 "$output" >> "$output.txt"
done < hosts.txt
Quando você chegar ao final do arquivo,
a instrução hosts.txt
falhará e o loop será finalizado.