Re: Incremental by 1 in the for loop (1375 Views)
Reply
Frequent Advisor
Posts: 49
Registered: ‎07-10-2007
Message 1 of 17 (1,376 Views)
Accepted Solution

Incremental by 1 in the for loop

He,

it is easy for 3 elements:
for i in 1 2 3; do echo $i; done

How I can make it for 100 elements without listing all the numbers? Thanks in advance.
Acclaimed Contributor
Posts: 21,184
Registered: ‎07-06-2000
Message 2 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

Hi:

#!/usr/bin/sh
typeset -i N=1
while (( N <= 100 ))
do
echo ${N}
N=$N+1
done

Regards!

...JRF...
Frequent Advisor
Posts: 49
Registered: ‎07-10-2007
Message 3 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

Thanks, any ideas with 'for' loop?
Acclaimed Contributor
Posts: 21,184
Registered: ‎07-06-2000
Message 4 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

Hi (again):

> Thanks, any ideas with 'for' loop?

No, not with the shell.

Regards!

...JRF...
Honored Contributor
Posts: 3,214
Registered: ‎08-26-1998
Message 5 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

Together with agreeing JRF's "not with `for`" view, I am under the impression that you are trying to do something with a vast number of files or similar. If this is the case, for directive can work for you, if you can come up with a regex (regular expression), covering all of these files. For example:

for file in `ls -1 /home/mydir/data/IN*`
do
echo ${file}
cp ${file} /home/mydir/archive
done

if you are dealing with sequential numbering and do not want to write numbers one-by-one manually, you have no other choice than using the while construct, as 'for' directive does not work the same way in UNIX shells as it does on high level languages as BASIC.

Hope this helps
________________________________
UNIX because I majored in cryptology...
Honored Contributor
Posts: 9,115
Registered: ‎02-23-2005
Message 6 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

> Thanks, any ideas with 'for' loop?

No matter how much you love your hammer,
sometimes a screwdriver is a better tool for
the job.


Perhaps you could "echo ${N}" into a
variable, and use that result in a "for"
statement. (But that wouldn't make it the
right thing to do.)
Acclaimed Contributor
Posts: 21,184
Registered: ‎07-06-2000
Message 7 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

Hi (again):

Steven makes a good point. If you want a better "hammer" you need to look elsewhere.

The 'sh-posix' manpages make it clear that a 'for' loop is the interation over a list unlike C's 'for' loop or even Perl's variations. In Perl, for example, I could write:

# perl -le 'for ($n=1;$n<=100;$n++) {print $n}'

...using the C-syntax for 'for'. However, I wouldn't do that when I could do:

# perl -le 'print for 1..100'

It's all about TIMTOWDI --- screwdrivers and hammers; but if all you have is a hammer, you have to use it as intended :-)

Regards!

...JRF...
Acclaimed Contributor
Posts: 25,602
Registered: ‎03-06-2006
Message 8 of 17 (1,376 Views)

Re: Increment by 1 in the for loop

[ Edited ]

>JRF: N=$N+1

A typo, it should be: (( N = N + 1 )) or (( N += 1 ))

 

(Actually that initial assignment does work but you can't have spaces.)

Esteemed Contributor
Posts: 830
Registered: ‎02-10-2003
Message 9 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

Hi,
to generate a range of
numbers for further use within a command pipe or
shell script. This can be done with some simple
sh-code:

------------------------ CUT HERE ------------------

#! /bin/sh

# range - Generate of numbers.

lo=$1
hi=$2

while [ $lo -le $hi ]
do
echo -n $lo " "
lo=`expr $lo + 1`
done

------------------------ CUT HERE ------------------

It can now be used a way like:

for i in $(range 1 100); do ; done


HTH,
Art
Respected Contributor
Posts: 733
Registered: ‎11-13-1996
Message 10 of 17 (1,376 Views)

Re: Incremental by 1 in the for loop

To my mind it can be done.

You generate the numbers in a file with
a while loop (see above), but output >$TMPFILE

and then in your forloop you do

for i in $(cat $TIMPFILE)
do
typeset -i count
print $count
count=count+1
done
Look before you leap
Acclaimed Contributor
Posts: 25,602
Registered: ‎03-06-2006
Message 11 of 17 (1,375 Views)

Re: Increment by 1 in the for loop

[ Edited ]

>Frank: To my mind it can be done.

Though in efficient, you could fix it as:
typeset -i count
for i in $(< $TMPFILE); do
    print $count
    (( count+=1 ))
done

Acclaimed Contributor
Posts: 21,184
Registered: ‎07-06-2000
Message 12 of 17 (1,375 Views)

Re: Incremental by 1 in the for loop

Hi (again):

As an encompassing remark, efficiency may not seem very measureable in small scripts operating on minute amounts of data. Good practices there, however, lead to fast, scalable code that "thinks green".

Using 'typeset -i' creates an integer variable that makes arithmetic faster.

Using '(( N = N + 1 ))' to increment an integer by one lets the shell do the work without spawning a completely different process as when 'N=`expr $N + 1`' is used.

Writing 'X=$(< $FILE)' instead of 'X=$(cat $FILE)' is a subtle but faster optimization for capturing the contents of a file into a variable.

While, TMTOWTDI, there are fast and there are slow(er) paths to travel.

Regards!

...JRF...
Honored Contributor
Posts: 1,007
Registered: ‎03-15-2009
Message 13 of 17 (1,375 Views)

Re: Incremental by 1 in the for loop

just a thought:

if it would be a linux server you could just simply use the 'seq' command like this:

for i in $(seq 1000)
do
echo "This is the $i line."
done
****
Unix operates with beer.
Super Advisor
Posts: 255
Registered: ‎08-20-2001
Message 14 of 17 (1,375 Views)

Re: Incremental by 1 in the for loop

James,
Where can I find the documentation for the "typeset" command.

I looked in man pages, typed "typeset -?" and "-h", looked in several books but still can't find it.

RayB
Acclaimed Contributor
Posts: 21,184
Registered: ‎07-06-2000
Message 15 of 17 (1,375 Views)

Re: Incremental by 1 in the for loop

Hi (again):

> James, Where can I find the documentation for the "typeset" command.

The 'typeset' command is documented in shell manpages:

http://docs.hp.com/en/B3921-60631/sh-posix.1.html

Regards!

...JRF...

Acclaimed Contributor
Posts: 25,602
Registered: ‎03-06-2006
Message 16 of 17 (1,375 Views)

Re: Incremental by 1 in the for loop

>JRF: Using '(( N = N + 1 ))' to increment an integer by one lets the shell do the work

Another reason to use ksh's (( )) is that it supports 64 bit integers and expr(1) only 32.
Esteemed Contributor
Posts: 830
Registered: ‎02-10-2003
Message 17 of 17 (1,375 Views)

Re: Incremental by 1 in the for loop

Hi,
revised to be more efficient:
------------------------ CUT HERE ------------------
#!/bin/sh
# range - Generate of numbers.
typeset -i lo=$1
typeset -1 hi=$2
while [ $lo -le $hi ]
do
echo -n $lo " "
(( lo=lo+1 ))
done
------------------------ CUT HERE ------------------

HTH,
Art
The opinions expressed above are the personal opinions of the authors, not of HP. By using this site, you accept the Terms of Use and Rules of Participation.