Pourquoi le comportement de while loop et for loop est-il différent?

tempo.txt de lire les détails d'user et de server du file tempo.txt et ensuite vérifier l'utilisation d'espace disque du système de files sur ce count unix en utilisant un autre script server_disk_space.sh je ne suis pas en mesure de comprendre pourquoi pendant que la boucle fonctionne seulement pour la première ligne et pour la boucle fonctionne bien. S'il vous plaît aidez-moi à comprendre cela.

Utilisation de la boucle 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 

Sortie

 8 

Utilisation de la boucle

 #!/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 

Sortie

 8 23 54 89 12 

Contenu 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 % 

Le script ci-dessus affiche la valeur du Use percentage de l' Use percentage du disque sur n'importe quel server.


Contenu de tempo.txt

 abclin542#abcwrk47# abclin540#abcwrk1# abclin541#abcwrk2# abclin543#abcwrk3# abclin544#abcwrk33# 

À less d'append l'option -n à ssh , ssh lira à partir de son input standard, qui dans le cas de la boucle while est le file tempo.txt.

Vous pouvez également utiliser un descripteur de file différent pour lire le file 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 

Si ces servers sont des servers GNU / Linux, votre script ssh pourrait être:

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

Ce qui serait probablement plus robuste et à l'épreuve du futur.