Very Basic Question regarding "while" loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Very Basic Question regarding "while" loop
# 8  
Old 05-21-2010
Quote:
Originally Posted by angshuman_ag
So, how do we define this behavior ?
Looks like you have already defined it correctly, when you were talking about "reads entire content in-memory".

Quote:
Originally Posted by angshuman_ag
Is it correct ?
Why not? Smilie

However I tested following and it worked, but there is at least one disadvantage, namely, the while loop processes the lines pretty slow, because it checks the file size for each line:
Code:
$ size=$(ls -l whiletest | awk '{print $5}')
$ echo $size
588890
$

Code:
$ while read line; do
if [ $(ls -l whiletest | awk '{print $5}') != $size ]; then
exit
else
echo $line
fi                                                                              
done <whiletest

When the loop was as 570th record, i emptied the file whiletest "> whiletest" from another terminal and the loop stopped immediately.
In theory the loop should also stop when one adds some lines to the file whiletest as well as when one removes a couple of lines from it.
Hope this is what you tried to achieve.
This User Gave Thanks to pseudocoder For This Post:
# 9  
Old 05-21-2010
Thats rocking !
# 10  
Old 05-22-2010
Alternatively,
Code:
if [ $(ls -l whiletest | awk '{print $5}') != $size ]; then

can be changed to:

Code:
if [ $(wc -c < whiletest ) != $size ]; then

At least, we can reduce one sub-shell and calling one more external command each time.
This matters if the file is too large.
# 11  
Old 05-22-2010
Thanks to all of you... M learning !
# 12  
Old 05-22-2010
Quote:
Originally Posted by gaurav1086
hello,

This seems to be implementation dependant. When a process opens a file for reading/writing, the operating system loads a chunk of the file in memory for the process to read/write. So when the process has done reading with that chunk, the OS loads another chunk. This is implementation dependant.

I tried the opposite, as the while loop was executing, I added a few more entries to the end of the file(cat >> file) and while read them all. So while has a dynamic behaviour which is OS dependant.

So I can conclude that it depends on two factors - 1. size of the file 2.OS policy.
However this behaviour will cause haphazard results. Its unpredictable way to achieve things.

Regards,
gaurav.
Hello,

Calling "rm" only removes the "inode" entry from the inode table(via `unlink` syscall). It does not wipe out the memory(memset or similar). So the contents can still be accessed by the process "while loop" in our case. The only thing is that the file cannot be accessed later by other processes as it doesnt have an inode entry.

I appreciate pseudocoder's solution. Image

Regards,
Gaurav.
# 13  
Old 05-22-2010
Quote:
Calling "rm" only removes the "inode" entry from the inode table(via `unlink` syscall). It does not wipe out the memory(memset or similar). So the contents can still be accessed by the process "while loop" in our case. The only thing is that the file cannot be accessed later by other processes as it doesnt have an inode entry.
The file continues to be accessible to the script because the script has an open file handle at the time the file was rm'ed. Even if the inode count is zero, the file is not marked deleted until all open file handles are closed. This is the expected behavior. Nothing to do with memory.
# 14  
Old 05-22-2010
Quote:
Originally Posted by anchal_khare
Alternatively,
Code:
if [ $(ls -l whiletest | awk '{print $5}') != $size ]; then

can be changed to:

Code:
if [ $(wc -c < whiletest ) != $size ]; then

At least, we can reduce one sub-shell and calling one more external command each time.
This matters if the file is too large.
Instead of checking for the size explicitly you can check if the file has an entry in the inode table in the first place.

Code:
FILE=somefile.txt
 while read line;do if [ -e "$FILE" ];then __Process $line;else echo "File no Longer exists";exit;fi;done< $FILE

Regards,
Gaurav.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

2. Shell Programming and Scripting

Failure: if grep "$Var" "$line" inside while read line loop

Hi everybody, I am new at Unix/Bourne shell scripting and with my youngest experiences, I will not become very old with it :o My code: #!/bin/sh set -e set -u export IFS= optl="Optl" LOCSTORCLI="/opt/lsi/storcli/storcli" ($LOCSTORCLI /c0 /vall show | grep RAID | cut -d " "... (5 Replies)
Discussion started by: Subsonic66
5 Replies

3. UNIX for Beginners Questions & Answers

Basic question on "echo"

what happens when I echo asterisk? Please don't hijack other peoples' thread; post our own new one as required by forum rules! (5 Replies)
Discussion started by: ithenr00
5 Replies

4. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

5. Shell Programming and Scripting

Question about the difference between "for" and "while" loop

dear all, i got some questions about for/while loop when working on redirect command output to for/while loop. take one for example : in for loop : allfiles=`find /var/log -maxdepth 1 -type f -mtime +5` index=1 for ((i=0; i<${#allfiles}; i++)); do echo "$index:${allfiles}" ... (2 Replies)
Discussion started by: tiger2000
2 Replies

6. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

7. UNIX for Advanced & Expert Users

A question/problem about oracle "tns listener" and "enterprise manager"

hi, I have a problem about the Oracle related components. I'm not able to find any answer yet, and waiting for your responses... Here is the configuration of my system: * an IBM P550 machine, * an AIX 5.3 running on it and * an oracle database, already installed on it. The problem (or... (1 Reply)
Discussion started by: talipk
1 Replies

8. UNIX and Linux Applications

A question/problem about oracle "tns listener" and "enterprise manager"

hi, I have * an IBM P550 machine, * an AIX 5.3 running on it and * an oracle database, already installed on it. The problem (or question of my own) is: Oracle tns listener, "CT_LISTENER", and the enterprise manager (EM) of the instance, which is uniq instance and called... (0 Replies)
Discussion started by: talipk
0 Replies

9. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question