Por que o comportamento de loop while e loop for diferente?

2

Estou tentando ler os detalhes de usuário e servidor do arquivo tempo.txt e, em seguida, verificar o uso do espaço em disco do sistema de arquivos nessa conta unix usando outro script server_disk_space.sh .Mas não consigo entender por que loop está trabalhando apenas para a primeira linha e para loop está funcionando bem.Por favor, ajude-me a entender isso.

Usando loop while

#!/usr/bin/ksh
while read line
do
r1='echo $line | cut -d"#" -f1';
r2='echo $line | cut -d"#" -f2';
apx_server_disk_space.sh $r2 $r1
done<tempo.txt

Saída

8

Usando para loop

#!/usr/bin/ksh
for line in $(cat tempo.txt)
do
r1='echo $line | cut -d"#" -f1';
r2='echo $line | cut -d"#" -f2';
apx_server_disk_space.sh $r2 $r1
done

Saída

8
23
54
89
12

Conteúdo de server_disk_space.sh

#!/usr/bin/ksh
user=$1
server=$2
count='ssh ${user}@${server} "df -h ."'
echo ${count} | awk '{print $12}' | tr -d %

O script acima exibe o valor de Use percentage do uso do disco em qualquer servidor.

Conteúdo de tempo.txt

abclin542#abcwrk47#
abclin540#abcwrk1#
abclin541#abcwrk2#
abclin543#abcwrk3#
abclin544#abcwrk33#
    
por g4ur4v 27.11.2012 / 14:48

1 resposta

5

A menos que você adicione a opção -n a ssh , ssh lerá sua entrada padrão, que no caso do loop while é o arquivo tempo.txt.

Como alternativa, você pode usar um descritor de arquivo diferente para ler o arquivo tempo.txt:

#! /usr/bin/ksh -
while IFS='#' read <&3 -r r1 r2 rest; do
  apx_server_disk_space.sh "$r2" "$r1"
done 3< tempo.txt

Se esses servidores forem servidores GNU / Linux, seu script ssh poderia ser:

#! /bin/sh -
ssh -n "$1@$2" 'stat -fc "scale=2;100*(1-%a/%b)" .' | bc

O que provavelmente seria mais robusto e futuro.

    
por 27.11.2012 / 15:01