args of 50+ files


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers args of 50+ files
# 8  
Old 11-20-2008
for-loops considered dangerous

I would like to question the use of for-loops to cycle through arbitrary lists.

As long as a list is of fixed length there is nothing problematic with a for-loop:

Code:
for x in a b c d e ; do
     do_something $x
done

The problem arises when shell-regexps ("globs") are used to expand to a list of files:

Code:
for file in $(ls some_pattern*) ; do
     do_something $file
done

In this case there is a chance of the script failing: the glob is expanded to a list of files before executing the commandline (this is shell standard) and - depending on the numbers of files it expands to - the command line could get longer than the maximum supported command line on POSIX systems (which is 4k characters, see sys/limits.h). In this case you run a chance of the shell terminating the script with a "command line too long" (or similar) error. This is true for ksh, bash and sh alike, probably for most of the other shells too.

What can be done to avoid this? The solution is quite simple: replace the "for x in ..."-construction with an equivalent while-loop and feed that with a pipeline. The second example from above could safely be rewritten as:

Code:
ls some_pattern* | while read file ; do
     do_something $file
done

I hope this helps.

bakunin
# 9  
Old 11-20-2008
Thanks!
I can't make it work though...
Where do I substitute with my real file name(s)?
I tried to combi the two codes and it didn't work. What is it I do wrong?
Code:
ls *contacts | while $file ; do awk '{printf ($2 in a) ? ","$5 : (NR>1) ? RS $2 FS $5 : $2 FS $5; a[$2]} END{print e}' $file done

# 10  
Old 11-20-2008
Quote:
Originally Posted by lost
What is it I do wrong?
Code:
ls *contacts | while $file ; do 
     awk '{printf ($2 in a) ? ","$5 : (NR>1) ? RS $2 FS $5 : $2 FS $5; a[$2]} END{print e}' $file 
done

The prolem is in the first line: sustitute "file" for "$file$ and add a "read", which is a keyword. See my example above. The first line schould be

"ls *contacts | while read file ; do"

and the variable "file" will hold one value after the other in each cycle of the loop. The following example is to make it better understandable:

Code:
ls *contacts | while read myvar ; do
     echo "===== $myvar ====="
done

Compare the output of this to the output of "ls -1 *contacts". You will notice that "myvar" gets filled with one value after the other in the loop as you can see when it is used in the echo-statement.

I hope this helps.

bakunin
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Edit $args within a command

Hi, I'm using a while loop for a given command "bowtie2" with several parameters. mkdir clean paste <(ls --quote-name ./qc/sg_*_R1_val_1.fq.gz) <(ls --quote-name ./qc/sg_*_R2_val_2.fq.gz) |sed 's/"./-1 ./' | sed 's/gz"\t/gz\t -2 /' | sed 's/"//g' |\ while read args ; do ... (5 Replies)
Discussion started by: sargotrons
5 Replies

2. Shell Programming and Scripting

Problem parsing args

Heya Tooltip: Parsing (getopts) for -u successfully sets mode=umnt, but case umnt is not executed, instead it either executes/show help or regular mount screen. I had copy pasted the structure of a getopts 'structure' from Man Page for getopts (posix Section 1) - The UNIX and Linux Forums... (1 Reply)
Discussion started by: sea
1 Replies

3. Shell Programming and Scripting

Store args passed in array but not the first 2 args

Store args passed in array but not the first 2 args. # bash declare -a arr=("$@") s=$(IFS=, eval 'echo "${arr}"') echo "$s" output: sh array.sh 1 2 3 4 5 6 1,2,3,4,5,6 Desired output: sh array.sh 1 2 3 4 5 6 3,4,5,6 (2 Replies)
Discussion started by: iaav
2 Replies

4. Shell Programming and Scripting

For Args and Nawk

I am trying to write a simple shell script that will take certain arguments (numerical values) and plug each one into a nawk command. I thought I would need to use for args x y z but i get syntax errors: for args 16 1 3 25 31 41 do nawk -F, '{if($10==$ &&... (8 Replies)
Discussion started by: he204035
8 Replies

5. UNIX for Dummies Questions & Answers

Parameters/Args

Hello, i have a problem. I must write a script, which wants 2 arguments. for example: ./test.sh x.txt y.txtit must be write x.txt in y.txt and when i give 1 or no argument like /.test.sh x.txtmust this give a error message like: SYNTAX <inputfile> <outputfile> my solution is... (5 Replies)
Discussion started by: eightball
5 Replies

6. UNIX for Dummies Questions & Answers

command line args 2

I have this while loop and at the end I am trying to get it to tell me the last argument I entered. And with it like this all I get is the sentence with no value for $1. Now I tried moving done after the sentence and it printed the value of $1 after every number. I don't want that I just want... (2 Replies)
Discussion started by: skooly5
2 Replies

7. UNIX for Dummies Questions & Answers

command line args

I am trying to print command line arguments one per second. I have this while do echo "6" shift echo "5" shift echo "4" shift echo "3" shift echo "2" shift echo "1" shift done (2 Replies)
Discussion started by: skooly5
2 Replies

8. Programming

Command line args

My program usage takes the form for example; $ theApp 2 "one or more words" i.e. 3 command line arguments; application name, an integer, some text My code includes the following 4 lines: int anInteger; char words; sscanf(argv, "%d", &anInteger); sscanf(argv, "%s", &message); Based... (2 Replies)
Discussion started by: enuenu
2 Replies

9. UNIX for Dummies Questions & Answers

alias with args how to ...

Hello ( sorry newbie question ) I don't understand something im trying to make simple alias that takes 1 arg but it don't gives me the desire result here is what I have : stlist | awk '{print "ls -l "$2}' now I want to translate it to alias that takes instead of the $2 one arg so I did : ... (4 Replies)
Discussion started by: umen
4 Replies

10. Shell Programming and Scripting

Args to Array

Hello all, I have a question. Please help me to populate an array with the arguments passing to a Shell scripts. For example when I call "abc.sh a1 a2 a3" args (a1, a2, ...) recieved in an Array inside the abc.sh arr = a1 arr = a2 and so on... Thanks in advance, (2 Replies)
Discussion started by: Shaz
2 Replies
Login or Register to Ask a Question