One our reader asks:
How do I generate a range of numbers under BASH for loop command? For example, I need to run particular command inside loop 100 or 500 times. Basically I want function that counts FROM and TO a range of numbers like 50-10.
To print a sequence of numbers use GNU seq command. In olden days we use our own shell script. But no more dirty shell script, just use good seq command.
This is quite handy when you want to writing shell scripts that requires loop-using range of numbers.
seq command syntax
seq LAST
seq FIRST LAST
seq FIRST INCREMENT LAST
If FIRST or INCREMENT is omitted, it defaults to 1. That is, an omitted INCREMENT defaults to 1 even when LAST is smaller than FIRST. FIRST, INCREMENT, and LAST are interpreted as floating point values. INCREMENT is usually positive if FIRST is smaller than LAST, and INCREMENT is usually negative if FIRST is greater than LAST.
Try out following examples:
$ seq 5
Output:
1 2 3 4 5
Few more examples:$ seq 5 10
$ seq 0 2 10
$ seq 5 -1 1
seq command and shell script (for loop)
You can use seq command in bash for loop as follows:
#!/bin/bash for i in $(seq 5) do echo "Welcome $i times" done
Bash for loop to generate a sequence of numbers
You can also use bash for loop as follows:
#!/bin/bash for ((a=1; a <= 5 ; a++)) do echo "Welcome $a times." done
Real World Experience
#!/bin/bash # Script to move topics from old shared hosting to new lighttpd vps server # U="http://forum.cyberciti.biz/viewtopic.php?t=" rdu="" for n in $(seq 1 521) do rdu="$(lynx --dump $U$n | egrep "vt([0-9]+)\.html$" | awk '{ print $2}' | uniq)" if [ "$rdu" == "" ]; then : else echo "$n => \"$rdu\"," fi rdu="" done
Above script generates a new php code (array) to match with variable t so that we can send 301 redirect. So anyone visiting old forum url http://www.cyberciti.biz/nixcraft/forum/viewtopic.php?t=513 will be redirected to new url :D
Next, I just need to copy and paste the array generated by shell script into viewtopic.php and all users are redirected to new url with 301 http code.
<?php $URLS = array ( .... .. 3 => "http://forum.cyberciti.biz/mysql-cluster-vt3.html", 4 => "http://forum.cyberciti.biz/nice-look-and-feel-vt4.html", 5 => "http://forum.cyberciti.biz/squid-monitoring-using-mrtg-vt5.html" .... ); $top=$_GET['t']; $u=$URLS[$top]; if ( isset($u)) { @include_once("../../include.genlib.php"); movePage(301, "$u"); } else { @include_once("../../include.genlib.php"); movePage(301, "http://forum.cyberciti.biz"); } ?>
Set a step value and generate a sequence number
In case, you are interested in my old (perhaps dirty) shell script ;)
#!/bin/bash # Usage: # ./script 1 5 + # ./script 100 50 - # where START END +/- FROM=$1 TO=$2 ACTION="$3" if [ "$ACTION" == "+" ]; then while [ $FROM -le $TO ] do echo -n $FROM " " (( FROM++ )) done echo "" else while [ $FROM -ge $TO ] do echo -n $FROM " " (( FROM-- )) done echo " " fi
Run script as follows to set a step value and generate a sequence:
$ chmod +x script
$ ./script 5 10 +
$ ./script 20 10 -
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop














{ 17 comments… read them below or add one }
bash3 makes it easier and more portable…
bash-3.00$ for i in {5..10}; do echo $i; done
Tariq
Good to know that you are upto date with BASH information. I don’t have bash 3 installed here but I am sure it will work out.
Appreciate your post.
i want to know , how to print 100 files using shell script
cd /path/to/directoryfor f in *
do
lp -d printer-name $f
done
Or simple:
cd /path/to/dir
lp -d printer-name *.txt
printing the FIRST 100 files:
cnt=0; for i in *; do if [ $cnt -lt 100 ]; then lp -d printer-name $i; fi; let cnt=cnt+1;done
If you’re only printing 100 out of 10,000 files, you’ll be stuck in that loop for a while unless you break out of it:
cnt=0; for i in *; do if [ $cnt -ge 100 ]; then break; else lp -d printer-name $i; fi; let cnt=cnt+1;done
If you have many (I mean _many_) files in that directory, asterisk expansion may break limits of the command line length; in that case, simple listing combined with head would probably do better:
ls | head -n 100 | lp -d printer-name
This
#!/bin/bash
for ((a=1; a <= 5 ; a++))
do
echo "Welcome $i times"
done
should be
#!/bin/bash
for ((a=1; a <= 5 ; a++))
do
echo "Welcome $a times"
done
how to print numbers side by side
i.e
i got the output as
1
2
3
4
5
1
2
3
4
1
2
3
1
2
1
but i neeed the output as
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
how to do ths in shell scripting
a=({1..5}) for i in {5..1} do echo ${a[*]:0:$i} doneabove question shell script what u need output
=========
#!/bin/sh
for ((i=5; i>=1; i– ))
do
for ((j=1; j<=i; j++ ))
do
echo -n "$i"
done
echo ""
done
==============
output
55555
4444
333
22
1
saikumar did you got shell script for your query
write a shell programm to generate the first ‘n’ terms of the following sqnce without using multiplication…
1 2 4 8 16 32…..
I continue to use the ‘outdated’ seq command because of an option you didn’t mention:
The -w option gives a sequence of numbers with equal width, by adding leading zeros if necessary.
echo {1..100}
And this is nice:
echo 1{6..9} 2{0..5}
16 17 18 19 20 21 22 23 24 25
Can someone please edit this one,
#!/bin/bash
# Usage:
# ./script 1 5 +
# ./script 100 50 -
# where START END +/-
FROM=$1
TO=$2
ACTION=”$3″
if [ "$ACTION" == "+" ];
then
while [ $FROM -le $TO ]
do
echo -n $FROM ” ”
(( FROM++ ))
done
echo “”
else
while [ $FROM -ge $TO ]
do
echo -n $FROM ” ”
(( FROM– ))
done
echo ” ”
fi
–instead of displaying it, it would be saved to a txt file. :)
like this
6001
6002
.
I just need it for a dictionary file. Thank you.