Bash is not installed on HP-UX by default. Also bash is not officially 
supported, you will not get help from HP support if problems with it arise.  
One rather typical error is installing wrong version of bash, for example 
installing IA64 version on PA RISK platform. In this case you get a message
   ... ... ...
   Bash v4.0+ has inbuilt support for setting up a step value using {START..END..INCREMENT} 
   syntax:
   #!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done
   Sample outputs:
   Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times
   ... ... ...
   Three-expression bash for loops syntax
   This type of for loop share a common heritage with the C programming language. It is characterized 
   by a three-parameter loop control expression; consisting of an initializer (EXP1), a loop-test or 
   condition (EXP2), and a counting expression (EXP3).
   for (( EXP1; EXP2; EXP3 ))
do
	command1
	command2
	command3
done
   A representative three-expression example in bash as follows:
   #!/bin/bash
for (( c=1; c<=5; c++ ))
do
   echo "Welcome $c times"
done
   ... ... ...
   Jadu Saikia, November 2, 2008, 3:37 pm
   
      Nice one. All the examples are explained well, thanks Vivek.seq 1 2 20
      output can also be produced using jot
      jot – 1 20 2
      The infinite loops as everyone knows have the following alternatives.
      while(true)
      or
      while :
      //Jadu 
   
   Andi Reinbrech, November 18, 2010, 7:42 pm
      I know this is an ancient thread, but thought this trick might be helpful to someone:For the 
      above example with all the cuts, simply do
      set `echo $line`
      This will split line into positional parameters and you can after the set simply say
      F1=$1; F2=$2; F3=$3
      I used this a lot many years ago on solaris with "set `date`", it neatly splits the whole date 
      string into variables and saves lots of messy cutting :-)
      … no, you can't change the FS, if it's not space, you can't use this method 
   
   Peko, July 16, 2009, 6:11 pm
      Hi Vivek,
      Thanks for this a useful topic.IMNSHO, there may be something to modify here
      =======================
      Latest bash version 3.0+ has inbuilt support for setting up a step value:
      #!/bin/bash
      for i in {1..5}
      =======================
      1) The increment feature seems to belong to the version 4 of bash.
      Reference:
      http://bash-hackers.org/wiki/doku.php/syntax/expansion/brace
      Accordingly, my bash v3.2 does not include this feature.
      BTW, where did you read that it was 3.0+ ?
      (I ask because you may know some good website of interest on the subject).
      2) The syntax is {from..to..step} where from, to, step are 3 integers.
      You code is missing the increment.
      Note that GNU Bash documentation may be bugged at this time,
      because on GNU Bash manual, you will find the syntax {x..y[incr]}
      which may be a typo. (missing the second ".." between y and increment).
      see
      
      http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion
      The Bash Hackers page
      again, see
      http://bash-hackers.org/wiki/doku.php/syntax/expansion/brace
      seeems to be more accurate,
      but who knows ? Anyway, at least one of them may be right… ;-)
      Keep on the good work of your own,
      Thanks a million.
      - Peko
   
   Michal Kaut July 22, 2009, 6:12 am
      Hello,is there a simple way to control the number formatting? I use several computers, some 
      of which have non-US settings with comma as a decimal point. This means that
      for x in $(seq 0 0.1 1) gives 0 0.1 0.2 … 1 one some machines and 0 0,1 0,2 … 1 on 
      other.
      Is there a way to force the first variant, regardless of the language settings? Can I, for example, 
      set the keyboard to US inside the script? Or perhaps some alternative to $x that 
      would convert commas to points?
      (I am sending these as parameters to another code and it won't accept numbers with commas…)
      The best thing I could think of is adding x=`echo $x | sed s/,/./` as a first 
      line inside the loop, but there should be a better solution? (Interestingly, the sed command does 
      not seem to be upset by me rewriting its variable.)
      Thanks,
      Michal
   
   Peko July 22, 2009, 7:27 am
   
      To Michal Kaut:
      Hi Michal,
      Such output format is configured through LOCALE settings.
      I tried :
      export LC_CTYPE="en_EN.UTF-8″; seq 0 0.1 1
      and it works as desired.
      You just have to find the exact value for LC_CTYPE that fits to your systems and your needs.
      Peko
   
   Peko July 22, 2009, 2:29 pm
   
      To Michal Kaus [2]
      Ooops – ;-)
      Instead of LC_CTYPE,
      LC_NUMERIC should be more appropriate
      (Although LC_CTYPE is actually yielding to the same result – I tested both)
      By the way, Vivek has already documented the matter :
      
      http://www.cyberciti.biz/tips/linux-find-supportable-character-sets.html
   
   Philippe Petrinko October 30, 2009, 8:35 am
   
      To Vivek:
      Regarding your last example, that is : running a loop through arguments given to the script on 
      the command line, there is a simplier way of doing this:
      # instead of:
      # FILES="$@"
      # for f in $FILES
      # use the following syntax
      for arg
      do
      # whatever you need here – try : echo "$arg"
      done
      Of course, you can use any variable name, not only "arg".
   
   Philippe Petrinko November 11, 2009, 11:25 am
   
      To tdurden:
      Why would'nt you use
      1) either a [for] loop
      for old in * ; do mv ${old} ${old}.new; done
      2) Either the [rename] command ?
      excerpt form "man rename" :
      RENAME(1) Perl Programmers Reference Guide RENAME(1)
      NAME
      rename – renames multiple files
      SYNOPSIS
      rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
      DESCRIPTION
      "rename" renames the filenames supplied according to the rule specified
      as the first argument. The perlexpr argument is a Perl expression
      which is expected to modify the $_ string in Perl for at least some of
      the filenames specified. If a given filename is not modified by the
      expression, it will not be renamed. If no filenames are given on the
      command line, filenames will be read via standard input.
      For example, to rename all files matching "*.bak" to strip the
      extension, you might say
      rename 's/\.bak$//' *.bak
      To translate uppercase names to lower, you'd use
      rename 'y/A-Z/a-z/' *
      - Philippe
   
   Philippe Petrinko November 11, 2009, 9:27 pm
   
      If you set the shell option extglob, Bash understands some more powerful patterns. Here, a 
      is one or more pattern, separated by the pipe-symbol (|).
      ?() Matches zero or one occurrence of the given patterns
      *() Matches zero or more occurrences of the given patterns
      +() Matches one or more occurrences of the given patterns
      @() Matches one of the given patterns
      !() Matches anything except one of the given patterns
      source: http://www.bash-hackers.org/wiki/doku.php/syntax/pattern
   
   Philippe Petrinko November 12, 2009, 3:44 pm
   
      To Sean:
      Right, the more sharp a knife is, the easier it can cut your fingers…
      I mean: There are side-effects to the use of file globbing (like in [ for f in * ] ) , when 
      the globbing expression matches nothing: the globbing expression is not susbtitued.
      Then you might want to consider using [ nullglob ] shell extension,
      to prevent this.
      see:
      
      http://www.bash-hackers.org/wiki/doku.php/syntax/expansion/globs#customization
      Devil hides in detail ;-)
   
   Dominic January 14, 2010, 10:04 am
   
      There is an interesting difference between the exit value for two different for looping structures 
      (hope this comes out right):
      for (( c=1; c<=2; c++ )) do echo -n "inside (( )) loop c is $c, "; done; echo "done (( )) 
      loop c is $c"
      for c in {1..2}; do echo -n "inside { } loop c is $c, "; done; echo "done { } loop c is $c"
      You see that the first structure does a final increment of c, the second does not. The first is 
      more useful IMO because if you have a conditional break in the for loop, then you can subsequently 
      test the value of $c to see if the for loop was broken or not; with the second structure you can't 
      know whether the loop was broken on the last iteration or continued to completion.
   
   Dominic January 14, 2010, 10:09 am
   
      sorry, my previous post would have been clearer if I had shown the output of my code snippet, 
      which is:
      inside (( )) loop c is 1, inside (( )) loop c is 2, done (( )) loop c is 3
      inside { } loop c is 1, inside { } loop c is 2, done { } loop c is 2
   
   Philippe Petrinko March 9, 2010, 2:34 pm
   
      @Dmitry
      And, again, as stated many times up there, using [seq] is counter productive, because it requires 
      a call to an external program, when you should Keep It Short and Simple, using only bash internals 
      functions:
      
      for ((c=1; c<21; c+=2)); do echo "Welcome $c times" ; done
 
      (and I wonder why Vivek is sticking to that old solution which should be presented only for 
      historical reasons when there was no way of using bash internals.
      By the way, this historical recall should be placed only at topic end, and not on top of the topic, 
      which makes newbies sticking to the not-up-to-date technique ;-) )
   
   Sean March 9, 2010, 11:15 pm
   
      I have a comment to add about using the builtin for (( … )) syntax. I would agree the 
      builtin method is cleaner, but from what I've noticed with other builtin functionality, I had 
      to check the speed advantage for myself. I wrote the following files:
      builtin_count.sh:
      
      #!/bin/bash
      for ((i=1;i<=1000000;i++))
      do
      echo "Output $i"
      done
 
      seq_count.sh:
      
      #!/bin/bash
      for i in $(seq 1 1000000)
      do
      echo "Output $i"
      done
 
      And here were the results that I got:
      time ./builtin_count.sh
      real 0m22.122s
      user 0m18.329s
      sys 0m3.166s
      time ./seq_count.sh
      real 0m19.590s
      user 0m15.326s
      sys 0m2.503s
      The performance increase isn't too significant, especially when you are probably going to be 
      doing something a little more interesting inside of the for loop, but it does show that builtin 
      commands are not necessarily faster.
   
   Andi Reinbrech November 18, 2010, 8:35 pm
      The reason why the external seq is faster, is because it is executed only once, and returns 
      a huge splurb of space separated integers which need no further processing, apart from the for 
      loop advancing to the next one for the variable substitution.
      The internal loop is a nice and clean/readable construct, but it has a lot of overhead. The 
      check expression is re-evaluated on every iteration, and a variable on the interpreter's heap 
      gets incremented, possibly checked for overflow etc. etc.
      Note that the check expression cannot be simplified or internally optimised by the interpreter 
      because the value may change inside the loop's body (yes, there are cases where you'd want to 
      do this, however rare and stupid they may seem), hence the variables are volatile and get re-evaluted.
      I.e. botom line, the internal one has more overhead, the "seq" version is equivalent to either 
      having 1000000 integers inside the script (hard coded), or reading once from a text file with 
      1000000 integers with a cat. Point being that it gets executed only once and becomes static.
      OK, blah blah fishpaste, past my bed time :-)
      Cheers,
      Andi
   
   Anthony Thyssen June 4, 2010, 6:53 am
   
      The {1..10} syntax is pretty useful as you can use a variable with it!
      limit=10
echo {1..${limit}}
{1..10}
      You need to eval it to get it to work!
      limit=10
eval "echo {1..${limit}}"
1 2 3 4 5 6 7 8 9 10
      'seq' is not avilable on ALL system (MacOSX for example)
      and BASH is not available on all systems either.
      You are better off either using the old while-expr method for computer compatiblity!
         limit=10; n=1;
   while [ $n -le 10 ]; do
     echo $n;
     n=`expr $n + 1`;
   done
      Alternativally use a seq() function replacement…
       # seq_count 10
seq_count() {
  i=1; while [ $i -le $1 ]; do echo $i; i=`expr $i + 1`; done
}
# simple_seq 1 2 10
simple_seq() {
  i=$1; while [ $i -le $3 ]; do echo $i; i=`expr $i + $2`; done
}
seq_integer() {
    if [ "X$1" = "X-f" ]
    then format="$2"; shift; shift
    else format="%d"
    fi
    case $# in
    1) i=1 inc=1 end=$1 ;;
    2) i=$1 inc=1 end=$2 ;;
    *) i=$1 inc=$2 end=$3 ;;
    esac
    while [ $i -le $end ]; do
      printf "$format\n" $i;
      i=`expr $i + $inc`;
    done
  }
      Edited: by Admin – added code tags.
   
   TheBonsai June 4, 2010, 9:57 am
      The Bash C-style for loop was taken from KSH93, thus I guess it's at least portable towards 
      Korn and Z.
      The seq-function above could use i=$((i + inc)), if only POSIX matters. expr is obsolete for 
      those things, even in POSIX.
   
   Philippe Petrinko June 4, 2010, 10:15 am
   
      Right Bonsai,
      (
      
      http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04 )
      But FOR C-style does not seem to be POSIXLY-correct…
      Read on-line reference issue 6/2004,
      Top is here,
      http://www.opengroup.org/onlinepubs/009695399/mindex.html
      and the Shell and Utilities volume (XCU) T.OC. is here
      http://www.opengroup.org/onlinepubs/009695399/utilities/toc.html
      doc is:
      
      http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap01.html
      and FOR command:
      
      http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_04_03
   
   Anthony Thyssen June 6, 2010, 7:18 am
   
      TheBonsai wrote…. "The seq-function above could use i=$((i + inc)), if only POSIX matters. 
      expr is obsolete for those things, even in POSIX."
      I am not certain it is in Posix. It was NOT part of the original Bourne Shell, and on some 
      machines, I deal with Bourne Shell. Not Ksh, Bash, or anything else.
      Bourne Shell syntax works everywhere! But as 'expr' is a builtin in more modern shells, then 
      it is not a big loss or slow down.
      This is especially important if writing a replacement command, such as for "seq" where you 
      want your "just-paste-it-in" function to work as widely as possible.
      I have been shell programming pretty well all the time since 1988, so I know what I am talking 
      about! Believe me.
      MacOSX has in this regard been the worse, and a very big backward step in UNIX compatibility. 
      2 year after it came out, its shell still did not even understand most of the normal 'test' functions. 
      A major pain to write shells scripts that need to also work on this system.
   
   TheBonsai June 6, 2010, 12:35 pm
   
      Yea, the question was if it's POSIX, not if it's 100% portable (which is a difference). The 
      POSIX base more or less is a subset of the Korn features (88, 93), pure Bourne is something "else", 
      I know. Real portability, which means a program can go wherever UNIX went, only in C ;)
   
   Philippe Petrinko November 22, 2010, 8:23 am
      And if you want to get rid of double-quotes, use:
      one-liner code:
      while read; do record=${REPLY}; echo ${record}|while read -d ","; do field="${REPLY#\"}"; 
      field="${field%\"}"; echo ${field}; done; done<data
 
      script code, added of some text to better see record and field breakdown:
      
      #!/bin/bash
      while read
      do
      echo "New record"
      record=${REPLY}
      echo ${record}|while read -d ,
      do
      field="${REPLY#\"}"
      field="${field%\"}"
      echo "Field is :${field}:"
      done
      done<data
 
      Does it work with your data?
      - PP
   
   Philippe Petrinko November 22, 2010, 9:01 am
   
      Of course, all the above code was assuming that your CSV file is named "data".
      If you want to use anyname with the script, replace:
      
      done<data
      
      With:
      
      done
 
      And then use your script file (named for instance "myScript") with standard input redirection:
      
      myScript < anyFileNameYouWant
 
      Enjoy!
   
   Philippe Petrinko November 22, 2010, 11:28 am
   
      well no there is a bug, last field of each record is not read – it needs a workout and may 
      be IFS modification ! After all that's what it was built for… :O)
   
   Anthony Thyssen November 22, 2010, 11:31 pm
   
      Another bug is the inner loop is a pipeline, so you can't assign variables for use later in 
      the script. but you can use '<<<' to break the pipeline and avoid the echo.
      But this does not help when you have commas within the quotes! Which is why you needed quotes 
      in the first place.
      In any case It is a little off topic. Perhaps a new thread for reading CVS files in shell should 
      be created.
   
   Philippe Petrinko November 24, 2010, 6:29 pm
   
      Anthony,
      Would you try this one-liner script on your CSV file?
      This one-liner assumes that CSV file named [data] has __every__ field double-quoted.
      
      while read; do r="${REPLY#\"}";echo "${r//\",\"/\"}"|while read -d \";do echo "Field is :${REPLY}:";done;done<data
 
      Here is the same code, but for a script file, not a one-liner tweak.
      
      #!/bin/bash
      # script csv01.sh
      #
      # 1) Usage
      # This script reads from standard input
      # any CSV with double-quoted data fields
      # and breaks down each field on standard output
      #
      # 2) Within each record (line), _every_ field MUST:
      # - Be surrounded by double quotes,
      # - and be separated from preceeding field by a comma
      # (not the first field of course, no comma before the first field)
      #
      while read
      do
      echo "New record" # this is not mandatory-just for explanation
      #
      #
      # store REPLY and remove opening double quote
      record="${REPLY#\"}"
      #
      #
      # replace every "," by a single double quote
      record=${record//\",\"/\"}
      #
      #
      echo ${record}|while read -d \"
      do
      # store REPLY into variable "field"
      field="${REPLY}"
      #
      #
      echo "Field is :${field}:" # just for explanation
      done
      done
 
      This script named here [cvs01.sh] must be used so:
      
      cvs01.sh < my-cvs-file-with-doublequotes
 
   
   Philippe Petrinko November 24, 2010, 6:35 pm
   
      @Anthony,
      By the way, using [REPLY] in the outer loop _and_ the inner loop is not a bug.
      As long as you know what you do, this is not problem, you just have to store [REPLY] value conveniently, 
      as this script shows.
   
   TheBonsai March 8, 2011, 6:26 am
   
      for ((i=1; i<=20; i++)); do printf "%02d\n" "$i"; done
   
   nixCraft 
   March 8, 2011, 6:37 am
   
      +1 for printf due to portability, but you can use bashy .. syntax too
      for i in {01..20}; do echo "$i"; done
   
   TheBonsai March 8, 2011, 6:48 am
   
      Well, it isn't portable per se, it makes it portable to pre-4 Bash versions.
      I think a more or less "portable" (in terms of POSIX, at least) code would be
      i=0
while [ "$((i >= 20))" -eq 0 ]; do
  printf "%02d\n" "$i"
  i=$((i+1))
done
   
   Philip Ratzsch April 20, 2011, 5:53 am
   
      I didn't see this in the article or any of the comments so I thought I'd share. While this 
      is a contrived example, I find that nesting two groups can help squeeze a two-liner (once for 
      each range) into a one-liner:
      for num in {{1..10},{15..20}};do echo $num;done
      Great reference article!
   
   Philippe Petrinko April 20, 2011, 8:23 am
   
      @Philip
      Nice thing to think of, using brace nesting, thanks for sharing.
      Philippe Petrinko May 6, 2011, 10:13 amHello Sanya,
      That would be because brace expansion does not support variables. I have to check this.
      Anyway, Keep It Short and Simple: (KISS) here is a simple solution I already gave above:
      xstart=1;xend=10;xstep=1
      for (( x = $xstart; x <= $xend; x += $xstep)); do echo $x;done
      Actually, POSIX compliance allows to forget $ in for quotes, as said before, you could also 
      write:
      xstart=1;xend=10;xstep=1
      for (( x = xstart; x <= xend; x += xstep)); do echo $x;done
   
   Philippe Petrinko May 6, 2011, 10:48 am
   
      Sanya,
      Actually brace expansion happens __before__ $ parameter exapansion, so you cannot use it this 
      way.
      Nevertheless, you could overcome this this way:
      max=10; for i in $(eval echo {1..$max}); do echo $i; done
   
   Sanya May 6, 2011, 11:42 am
   
      Hello, Philippe
      Thanks for your suggestions
      You basically confirmed my findings, that bash constructions are not as simple as zsh ones.
      But since I don't care about POSIX compliance, and want to keep my scripts "readable" for less 
      experienced people, I would prefer to stick to zsh where my simple for-loop works
      Cheers, Sanya
   
   Philippe Petrinko May 6, 2011, 12:07 pm
   
      Sanya,
      First, you got it wrong: solutions I gave are not related to POSIX, I just pointed out that 
      POSIX allows not to use $ in for (( )), which is just a little bit more readable – sort of.
      Second, why do you see this less readable than your [zsh] [for loop]?
      for (( x = start; x <= end; x += step)) do
      echo "Loop number ${x}"
      done
      It is clear that it is a loop, loop increments and limits are clear.
      IMNSHO, if anyone cannot read this right, he should not be allowed to code. :-D
      BFN
   
   Anthony Thyssen May 8, 2011, 11:30 pm
   
      If you are going to do… $(eval echo {1..$max});
      You may as well use "seq" or one of the many other forms.
      See all the other comments on doing for loops.
   
   Tom P May 19, 2011, 12:16 pm
   
      I am trying to use the variable I set in the for line on to set another variable with a different 
      extension. Couldn't get this to work and couldnt find it anywhere on the web… Can someone help.
      Example:
      FILE_TOKEN=`cat /tmp/All_Tokens.txt`
for token in $FILE_TOKEN
do
A1_$token=`grep $A1_token /file/path/file.txt | cut -d ":" -f2`
      my goal is to take the values from the ALL Tokens file and set a new variable with A1_ infront 
      of it… This tells be that A1_ is not a command…