dominique120
dominique120

Reputation: 1302

Reversing a bash for loop

I have this:

for (( count= "$WP_RANGE_START"; count< "$WP_RANGE_STOP"+1; count=count+1 ));

Where WP_RANGE_STARTis a number like 1 and WP_RANGE_STOPis a number like 10.

Right now this will step though going 1,2,...10

How can I do so that it counts backwards?(10,9,...1)

Upvotes: 1

Views: 208

Answers (3)

mikeserv
mikeserv

Reputation: 694

The for loop is your problem.

i=11 ; until [ $((i=i-1)) -lt 1 ] ; do echo $i ; done

OUTPUT

10
9
8
7
6
5
4
3
2
1

You don't need any bashisms at all.

Upvotes: 0

William Everett
William Everett

Reputation: 781

Your incrementing code can be "simplified" as:

for count in $(eval echo {$WP_RANGE_START..$WP_RANGE_STOP});

So, to decrement you can just reverse the parameters"

for count in $(eval echo {$WP_RANGE_STOP..$WP_RANGE_START}); 

Assuming you've got a bash version of 3 or higher, you can specify an increment or decrement by appending it to the range, like so:

CHANGE=1
for count in $(eval echo {$WP_RANGE_STOP..$WP_RANGE_START..$CHANGE}); 

Upvotes: 0

kojiro
kojiro

Reputation: 77127

I guess the mirror image of what you have would be

for (( count="$WP_RANGE_STOP"; count >= "$WP_RANGE_START"; count=count-1 ));

But a less cumbersome way to write it would be

for (( count=WP_RANGE_STOP; count >= WP_RANGE_START; count-- ));

The $ is unnecessary in arithmetic context.

When dealing with literals, bash has a range expansion feature using brace expansion:

for i in {0..10}; # or {10..0} or what have you

But it's cumbersome to use with variables, as the brace expansion happens before parameter expansion. It's usually easier to use arithmetic for loops in those cases.

Upvotes: 4

Related Questions