Testing for EOF during a while loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Testing for EOF during a while loop
# 1  
Old 10-07-2010
Testing for EOF during a while loop

I'm a complete UNIX newbie trying to write a simple shell script. The pseudo-code for the part I'm having trouble with is as such:

read something
while [ there is something ]; do this

The loop terminates at EOF (like when Ctrl+D is pushed) and displays the number of lines the user entered (kept in the loop as a variable that increments...easy). Thing is, I can't figure out how to set the loop condition to end when it reaches EOF (usually when the user pushes Ctrl+D). Any suggestions?
# 2  
Old 10-07-2010
One idea, but it always helps to know what Shell you are using. If nothing else because there is variation on the syntax for echo.

Code:
counter=0
while true
do
        echo "Enter something: \c" ; read ans
        if [ "${ans}""X" = "X" ]
        then
                break
        fi
        counter=`expr ${counter} + 1`
done
echo "You answered ${counter} times"

This User Gave Thanks to methyl For This Post:
# 3  
Old 10-07-2010
Thanks, that actually works...but now I'd like to understand how it works. I think the line I'm most confused with is this one:

if [ "${ans}""X" = "X" ]
Is this the one that tests for EOF? I'm not quite sure what it's doing. All the other lines of script I seem to understand, except this one...
# 4  
Old 10-07-2010
Alternatively:
Code:
i=0
while read ans
do 
  i=$(( i+1 ))
done
echo $i

# 5  
Old 10-07-2010
Quote:
Originally Posted by Sovereign110
Thanks, that actually works...but now I'd like to understand how it works. I think the line I'm most confused with is this one:

if [ "${ans}""X" = "X" ]
Is this the one that tests for EOF? I'm not quite sure what it's doing. All the other lines of script I seem to understand, except this one...
When ctl-D is entered the value assigned to the variable ans is null. In this case, the if evaluates true because <nul>X is the same as Xand thus the loop is broken.

This is an alternative:
Code:
#!/usr/bin/env ksh
count=0
printf ">"
while read line
do
        printf ">"
        count=$((count+1))
done
echo "read $count lines"
exit

While will read from standard input until the end of the file and exit the loop without an explicit test. The only "odd" thing is the need to issue a prompt before the loop.
This User Gave Thanks to agama For This Post:
# 6  
Old 10-07-2010
Code:
if [ "${ans}""X" = "X" ]

Because I don't know what Shell you are using I went for a syntax which works in most derivatives of the Bourne shell.

The syntax is avoiding a syntax error if the contents of ${ans} is blank. The variable ${ans} can be blank because the user pressed Enter or because the user typed Ctrl/D (unix end of file). When $[ans} is blank we are just comparing character "X" with character "X".

As Scrutinizer's post shows, in some shells you can do arithmetic in $(( )) variables. Depends what you have got available.
# 7  
Old 10-07-2010
Well everything so far has worked. I think I'm using Fedora or Red Hat Linux...though I'm not 100% sure. I'd have to find out...

But thanks to all the responses so far, they've been a big help.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

help using EOF inside a for loop

I'm having problems with this example: #!/bin/bash for i in server1 server2 server3 do ssh $i <<EOF >> logfile.txt dat1=`date '+%m/%d/%y'` hst=`hostname` df -Ph | awk -v OFS=',' -v dat="$dat1,$hst" ' {print dat,$1,$6,$3,$4 } ' exit EOF done I'm... (1 Reply)
Discussion started by: kuliksco
1 Replies

2. Shell Programming and Scripting

confused with << EOF EOF

Hi friends , I am confused with << EOF EOF Most of the cases I found sqlplus $db_conn_str << EOF some sql staments EOF another exapmle is #!/bin/sh echo -n 'what is the value? ' read value sed 's/XXX/'$value'/' <<EOF The value is XXX EOF (1 Reply)
Discussion started by: imipsita.rath
1 Replies

3. Shell Programming and Scripting

Until eof do????

Hey! Can I write a routine that allows me to in a txt file check line by line until the end of file? something like until do ---some code--- done maybe it is a stupid question but I never learned shell scripts and I need this :p thanks in advance (1 Reply)
Discussion started by: ruben.rodrigues
1 Replies

4. Programming

Eof

How can I write EOF into a file? I tryed to do as follows: size=sizeof(EOF); end_of_file=EOF; write(fdMutexRichieste, &end_of_file, size); But it does non work correctly, becouse in the next cicle (using lseek(..., SEEK_END) of my code it seems to ignore my EOF and use the LAST... (5 Replies)
Discussion started by: DNAx86
5 Replies

5. UNIX for Dummies Questions & Answers

Testing For Loop condition

How do I test the return condition in the script if no files are found: for file in `Find ${LANDING_FILE_DIR}${BTIME_FILENAME_PATTERN}` do ... .. done I want to capture the return code so I can echo the error or condition. Using if ] always returns zero no matter where it's placed. ... (4 Replies)
Discussion started by: mavsman
4 Replies

6. Shell Programming and Scripting

What is << EOF

I'm trying to connect to oracle with the following code in the script: checksqlerror{ if echo $1 exit fi } $SQLPLUS username/password@schemaname checksqlerror "failed to connect to oracle" If I'm passing wrong schema name,instead of executing checksqlerror it stops and expects user... (2 Replies)
Discussion started by: BhawanaAggarwal
2 Replies

7. Shell Programming and Scripting

Eof

hi, in a shell script i came accross the following bit of code 1.shift $(($OPTIND - 1)) 2.if ; then 3. cat << EOF >&2 4.Usage: $0 lockfilename 5.EOF 6. exit 1 7.fi I am not able to understand the meaning of lines(1,3,5). Can any one of u tell me the purpose of above said lines.... (1 Reply)
Discussion started by: ravi raj kumar
1 Replies

8. UNIX for Dummies Questions & Answers

Eof

hello all, how end of a file is detected in UNIX system? does it make use of any special symbols to identify the EOF? :( thank you all (5 Replies)
Discussion started by: compbug
5 Replies

9. Shell Programming and Scripting

EOF use

Hi, I'd like to access a windows directory from aix with samba client. To allow direct access (not interactive), i'm using EOF like: smbclient \\\\winserver\\windir 'passwd' -U usersmb << EOF cd subwindir put myfile EOF The access is correct but does somebody know how to trap errors... (1 Reply)
Discussion started by: jo_aze
1 Replies
Login or Register to Ask a Question