Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I am trying to read user and server details from file tempo.txt and then check the disk space usage of the file system on that unix account using another script server_disk_space.sh.But I am not able to figure out why while loop is only working for first line and for loop is working fine.Please help me understand this.


Using while loop

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

Output

8

Using for 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

Output

8
23
54
89
12

Contents of server_disk_space.sh

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

Above script outputs the value of Use percentage of Disk Usage on any server .


Contents of tempo.txt

abclin542#abcwrk47#
abclin540#abcwrk1#
abclin541#abcwrk2#
abclin543#abcwrk3#
abclin544#abcwrk33#
share|improve this question
add comment

1 Answer

up vote 2 down vote accepted

Unless you add the -n option to ssh, ssh will read from its standard input, which in the case of the while loop is the tempo.txt file.

Alternatively, you can use a different file descriptor to read the tempo.txt file:

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

If those servers are GNU/Linux servers, your ssh script could be:

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

Which would probably be more robust and future-proof.

share|improve this answer
    
Hi, the alternative you gave works great but that again doesn't answer why the while loop I am using fails. Adding -n to ssh don't make any difference here . Thanks for answering. –  g4ur4v Nov 27 '12 at 14:19
    
It fails because something in the first pass of the loop is reading from stdin which is that tempo.txt so that the next read command has nothing else to read since that has already been read by that command. It's a common problem with ssh in a while loop. ssh -n should fix it. If it doesn't, you could also do ssh < /dev/null instead or use the suggested alternative. –  Stephane Chazelas Nov 27 '12 at 14:50
    
Please ignore my comment. -n for ssh works. –  g4ur4v Nov 27 '12 at 15:02
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.