2005/06/02 Bash looping

There are so many different ways to create bash loops. Let's just look at a few. After the first, I'll only list the initial line:



for i in 1 2 3 4 cow
do
 echo $i
done


Hate these ads?



# alternate:



for i in 1 2 3 4 cow; do echo $i;done



for i in `seq 1 10`








for ((j=1; j <= 10; j+=2))



while ((x++ < 10))



until ((x-- < -10))



for i in $(ls)



for in in `cat /tmp/somefile`







Two other commands are useful within loops: "break" exits a loop, and "continue" goes to the next iteration:



for i in 1 2 3 4 cow 6 7 8
do
  # skips "cow"
  ((i * 1 ==  0)) && continue
 echo $i
done



for i in 1 2 3 4 cow 6 7 8
do
  # stops after "4"
  ((i * 1 ==  0)) && break
 echo $i
done


Arrays can be looped:



array=(one two three)
for x in ${array[@]}
do
   echo $x
done



array=(one two three)
for ((x=0; x < ${#array[@]} ; x++))
do
   echo ${array[$x]}
done


A problem that often comes up for new users is looping over certain files. For example, you might want to do something to every .txt file:



for i in *.txt
do
 something $i
done


That works, but if there are no ".txt" files, "something" gets passed "*.txt" just the same. If that's not a good thing, you need to do more:



if `ls *.txt > /dev/null 2>&1`
then
for i in *.txt
do
 something $i
done
fi


Or you might do something like this:



count=`ls *.txt 2>/dev/null | wc -l`
if [ "$count" -gt 0 ]
then
 echo "$count files to back up"
 for i in *.txt
 do
  something $i
 done
fi  


Yet another way to do something like that is:



set -- *.txt
[ -f "$1" ] && dosomething *.txt


If the set gets nothing, $1 will be empty. Another advantage is that you don't loop over each file if you don't need to.

As you've seen, there are a lot of different ways to do bash looping. Which you use depends mostly on on what you are trying to accomplish, and to a lesser extent on your own style and preferences.




Enter your email address for automatic notification of new posts here
(be sure to whitelist 'feedburner.com' if you use spam filtering)

Or use any RSS reader

Delivered by FeedBurner


Views for this page
Today This Week This Month This Year  Overall
61022652,994 5,991

Have you tried Searching this site?

Unix/Linux/Mac OS X support by phone, email or on-site: Support Rates

This is a Unix/Linux resource website. It contains technical articles about Unix, Linux and general computing related subjects, opinion, news, help files, how-to's, tutorials and more. We appreciate comments and article submissions.

Publishing your articles here

pavatar.jpg
More:
       - Shell




Unix/Linux Consultants

Your ad here - $48.00 yearly!

http://www.breakthru.com.au SCO (Openserver and Unixware), Unix, Solaris and Linux Consulting services including: Secure Networking Solutions; Linux based Firewalls; Backup Solutions; Secure Home to Office Network Setup; Phone, Remote and On-Site Support available - Satisfaction Guaranteed!


http://www.schewanick.com SCO Unix, Solaris, Linx (various), PHP, MySQL, Apache, uniBasic, dL4, Perl, System Administration and more....


http://www.vss3.com SCO/Caldera OpenServer, Unixware & Linux. Tarantella & Non-stop Clustering



Twitter
  • Nov 21 07:55
    @loudmouthman: correct, but how do you prove ANYTHING like that is accurate? You can't. A text file is no better or worse than anything.
  • Nov 21 07:40
    @loudmouthman: well, a digital signature could prove it hadn't been altered. Text is no more insecure than anything else in that sense.




card_image








Change Congress


Related Posts