~ubuntu-branches/ubuntu/natty/abs-guide/natty

« back to all changes in this revision

Viewing changes to abs/HTML/bashver3.html

  • Committer: Bazaar Package Importer
  • Author(s): Sandro Tosi
  • Date: 2010-05-09 17:49:52 UTC
  • mfrom: (1.2.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20100509174952-1s583w0zbh7rl1po
Tags: 6.2-1
* New upstream release; Closes: #441278
* debian/control
  - adopting package; Closes: #577181
  - removed bzip2 from b-d-i, no more needed
  - debhelper has to be in b-d
  - bump Standards-Version to 3.8.4 (no changes needed)
  - added Homepage field
  - added misc:Depends to Depends
  - added Vcs-{Browser, Git} field
* debian/rules
  - removed the unpacking stuff, we now use an alrqady unpacked source
  - added more example scripts to fix
* debian/{compat, control, rules}
  - switched to debhelper 7
* debian/watch
  - updated to new upstream location; thanks to Raphael Geissert for the
    report; Closes: #453596
* debian/copyright
  - updated with new location and copyright/license notices
* debian/source/format
  - set source package format to 1.0 explicitly
* debian/abs-guide.doc-base
  - set Section field correctly
* debian/{copyright, abs-guide.doc-base}
  - updated upstream email
* debian/abs-guide.lintian-overrides
  - added override for "known syntax-errored" scripts

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 
2
<HTML
 
3
><HEAD
 
4
><TITLE
 
5
>Bash, version 3</TITLE
 
6
><META
 
7
NAME="GENERATOR"
 
8
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 
9
"><LINK
 
10
REL="HOME"
 
11
TITLE="Advanced Bash-Scripting Guide"
 
12
HREF="index.html"><LINK
 
13
REL="UP"
 
14
TITLE="Bash, versions 2, 3, and 4"
 
15
HREF="bash2.html"><LINK
 
16
REL="PREVIOUS"
 
17
TITLE="Bash, versions 2, 3, and 4"
 
18
HREF="bash2.html"><LINK
 
19
REL="NEXT"
 
20
TITLE="Bash, version 4"
 
21
HREF="bashver4.html"><META
 
22
HTTP-EQUIV="Content-Style-Type"
 
23
CONTENT="text/css"><LINK
 
24
REL="stylesheet"
 
25
HREF="common/kde-common.css"
 
26
TYPE="text/css"><META
 
27
HTTP-EQUIV="Content-Type"
 
28
CONTENT="text/html; charset=iso-8859-1"><META
 
29
HTTP-EQUIV="Content-Language"
 
30
CONTENT="en"><LINK
 
31
REL="stylesheet"
 
32
HREF="common/kde-localised.css"
 
33
TYPE="text/css"
 
34
TITLE="KDE-English"><LINK
 
35
REL="stylesheet"
 
36
HREF="common/kde-default.css"
 
37
TYPE="text/css"
 
38
TITLE="KDE-Default"></HEAD
 
39
><BODY
 
40
CLASS="SECT1"
 
41
BGCOLOR="#FFFFFF"
 
42
TEXT="#000000"
 
43
LINK="#AA0000"
 
44
VLINK="#AA0055"
 
45
ALINK="#AA0000"
 
46
STYLE="font-family: sans-serif;"
 
47
><DIV
 
48
CLASS="NAVHEADER"
 
49
><TABLE
 
50
SUMMARY="Header navigation table"
 
51
WIDTH="100%"
 
52
BORDER="0"
 
53
CELLPADDING="0"
 
54
CELLSPACING="0"
 
55
><TR
 
56
><TH
 
57
COLSPAN="3"
 
58
ALIGN="center"
 
59
>Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting</TH
 
60
></TR
 
61
><TR
 
62
><TD
 
63
WIDTH="10%"
 
64
ALIGN="left"
 
65
VALIGN="bottom"
 
66
><A
 
67
HREF="bash2.html"
 
68
ACCESSKEY="P"
 
69
>Prev</A
 
70
></TD
 
71
><TD
 
72
WIDTH="80%"
 
73
ALIGN="center"
 
74
VALIGN="bottom"
 
75
>Chapter 36. Bash, versions 2, 3, and 4</TD
 
76
><TD
 
77
WIDTH="10%"
 
78
ALIGN="right"
 
79
VALIGN="bottom"
 
80
><A
 
81
HREF="bashver4.html"
 
82
ACCESSKEY="N"
 
83
>Next</A
 
84
></TD
 
85
></TR
 
86
></TABLE
 
87
><HR
 
88
ALIGN="LEFT"
 
89
WIDTH="100%"></DIV
 
90
><DIV
 
91
CLASS="SECT1"
 
92
><H1
 
93
CLASS="SECT1"
 
94
><A
 
95
NAME="BASHVER3"
 
96
></A
 
97
>36.2. Bash, version 3</H1
 
98
><P
 
99
><A
 
100
NAME="BASH3REF"
 
101
></A
 
102
></P
 
103
><P
 
104
>On July 27, 2004, Chet Ramey released version 3 of Bash.
 
105
        This update fixed quite a number of bugs and added new
 
106
        features.</P
 
107
><P
 
108
>Some of the more important added features:
 
109
 
 
110
      <UL
 
111
><LI
 
112
><P
 
113
><A
 
114
NAME="BRACEEXPREF3"
 
115
></A
 
116
></P
 
117
><P
 
118
>A new, more generalized <B
 
119
CLASS="COMMAND"
 
120
>{a..z}</B
 
121
> <A
 
122
HREF="special-chars.html#BRACEEXPREF"
 
123
>brace expansion</A
 
124
> operator.</P
 
125
><P
 
126
><TABLE
 
127
BORDER="0"
 
128
BGCOLOR="#E0E0E0"
 
129
WIDTH="90%"
 
130
><TR
 
131
><TD
 
132
><PRE
 
133
CLASS="PROGRAMLISTING"
 
134
>   1&nbsp;#!/bin/bash
 
135
   2&nbsp;
 
136
   3&nbsp;for i in {1..10}
 
137
   4&nbsp;#  Simpler and more straightforward than
 
138
   5&nbsp;#+ for i in $(seq 10)
 
139
   6&nbsp;do
 
140
   7&nbsp;  echo -n "$i "
 
141
   8&nbsp;done
 
142
   9&nbsp;
 
143
  10&nbsp;echo
 
144
  11&nbsp;
 
145
  12&nbsp;# 1 2 3 4 5 6 7 8 9 10
 
146
  13&nbsp;
 
147
  14&nbsp;
 
148
  15&nbsp;
 
149
  16&nbsp;# Or just . . .
 
150
  17&nbsp;
 
151
  18&nbsp;echo {a..z}    #  a b c d e f g h i j k l m n o p q r s t u v w x y z
 
152
  19&nbsp;echo {e..m}    #  e f g h i j k l m
 
153
  20&nbsp;echo {z..a}    #  z y x w v u t s r q p o n m l k j i h g f e d c b a
 
154
  21&nbsp;               #  Works backwards, too.
 
155
  22&nbsp;echo {25..30}  #  25 26 27 28 29 30
 
156
  23&nbsp;echo {3..-2}   #  3 2 1 0 -1 -2
 
157
  24&nbsp;echo {X..d}    #  X Y Z [  ] ^ _ ` a b c d
 
158
  25&nbsp;               #  Shows (some of) the ASCII characters between Z and a,
 
159
  26&nbsp;               #+ but don't rely on this type of behavior because . . .
 
160
  27&nbsp;echo {]..a}    #  {]..a}
 
161
  28&nbsp;               #  Why?
 
162
  29&nbsp;
 
163
  30&nbsp;
 
164
  31&nbsp;# You can tack on prefixes and suffixes.
 
165
  32&nbsp;echo "Number #"{1..4}, "..."
 
166
  33&nbsp;     # Number #1, Number #2, Number #3, Number #4, ...
 
167
  34&nbsp;
 
168
  35&nbsp;
 
169
  36&nbsp;# You can concatenate brace-expansion sets.
 
170
  37&nbsp;echo {1..3}{x..z}" +" "..."
 
171
  38&nbsp;     # 1x + 1y + 1z + 2x + 2y + 2z + 3x + 3y + 3z + ...
 
172
  39&nbsp;     # Generates an algebraic expression.
 
173
  40&nbsp;     # This could be used to find permutations.
 
174
  41&nbsp;
 
175
  42&nbsp;# You can nest brace-expansion sets.
 
176
  43&nbsp;echo {{a..c},{1..3}}
 
177
  44&nbsp;     # a b c 1 2 3
 
178
  45&nbsp;     # The "comma operator" splices together strings.
 
179
  46&nbsp;
 
180
  47&nbsp;
 
181
  48&nbsp;# Unfortunately, brace expansion does not lend itself to parameterization.
 
182
  49&nbsp;var1=1
 
183
  50&nbsp;var2=5
 
184
  51&nbsp;echo {$var1..$var2}   # {1..5}</PRE
 
185
></TD
 
186
></TR
 
187
></TABLE
 
188
></P
 
189
></LI
 
190
><LI
 
191
><P
 
192
>The <B
 
193
CLASS="COMMAND"
 
194
>${!array[@]}</B
 
195
> operator, which
 
196
            expands to all the indices of a given <A
 
197
HREF="arrays.html#ARRAYREF"
 
198
>array</A
 
199
>.</P
 
200
><P
 
201
><TABLE
 
202
BORDER="0"
 
203
BGCOLOR="#E0E0E0"
 
204
WIDTH="90%"
 
205
><TR
 
206
><TD
 
207
><PRE
 
208
CLASS="PROGRAMLISTING"
 
209
>   1&nbsp;#!/bin/bash
 
210
   2&nbsp;
 
211
   3&nbsp;Array=(element-zero element-one element-two element-three)
 
212
   4&nbsp;
 
213
   5&nbsp;echo ${Array[0]}   # element-zero
 
214
   6&nbsp;                   # First element of array.
 
215
   7&nbsp;
 
216
   8&nbsp;echo ${!Array[@]}  # 0 1 2 3
 
217
   9&nbsp;                   # All the indices of Array.
 
218
  10&nbsp;
 
219
  11&nbsp;for i in ${!Array[@]}
 
220
  12&nbsp;do
 
221
  13&nbsp;  echo ${Array[i]} # element-zero
 
222
  14&nbsp;                   # element-one
 
223
  15&nbsp;                   # element-two
 
224
  16&nbsp;                   # element-three
 
225
  17&nbsp;                   #
 
226
  18&nbsp;                   # All the elements in Array.
 
227
  19&nbsp;done</PRE
 
228
></TD
 
229
></TR
 
230
></TABLE
 
231
></P
 
232
></LI
 
233
><LI
 
234
><P
 
235
><A
 
236
NAME="REGEXMATCHREF"
 
237
></A
 
238
></P
 
239
><P
 
240
>The <B
 
241
CLASS="COMMAND"
 
242
>=~</B
 
243
> <A
 
244
HREF="regexp.html#REGEXREF"
 
245
>Regular
 
246
            Expression</A
 
247
> matching operator within a <A
 
248
HREF="tests.html#DBLBRACKETS"
 
249
>double brackets</A
 
250
> test expression.
 
251
            (Perl has a similar operator.)</P
 
252
><P
 
253
><TABLE
 
254
BORDER="0"
 
255
BGCOLOR="#E0E0E0"
 
256
WIDTH="90%"
 
257
><TR
 
258
><TD
 
259
><PRE
 
260
CLASS="PROGRAMLISTING"
 
261
>   1&nbsp;#!/bin/bash
 
262
   2&nbsp;
 
263
   3&nbsp;variable="This is a fine mess."
 
264
   4&nbsp;
 
265
   5&nbsp;echo "$variable"
 
266
   6&nbsp;
 
267
   7&nbsp;# Regex matching with =~ operator within [[ double brackets ]].
 
268
   8&nbsp;if [[ "$variable" =~ T.........fin*es* ]]
 
269
   9&nbsp;# NOTE: As of version 3.2 of Bash, expression to match no longer quoted.
 
270
  10&nbsp;then
 
271
  11&nbsp;  echo "match found"
 
272
  12&nbsp;      # match found
 
273
  13&nbsp;fi</PRE
 
274
></TD
 
275
></TR
 
276
></TABLE
 
277
></P
 
278
><P
 
279
>Or, more usefully:</P
 
280
><P
 
281
><TABLE
 
282
BORDER="0"
 
283
BGCOLOR="#E0E0E0"
 
284
WIDTH="90%"
 
285
><TR
 
286
><TD
 
287
><PRE
 
288
CLASS="PROGRAMLISTING"
 
289
>   1&nbsp;#!/bin/bash
 
290
   2&nbsp;
 
291
   3&nbsp;input=$1
 
292
   4&nbsp;
 
293
   5&nbsp;
 
294
   6&nbsp;if [[ "$input" =~ "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]]
 
295
   7&nbsp;#                 ^ NOTE: Quoting not necessary, as of version 3.2 of Bash.
 
296
   8&nbsp;# NNN-NN-NNNN (where each N is a digit).
 
297
   9&nbsp;then
 
298
  10&nbsp;  echo "Social Security number."
 
299
  11&nbsp;  # Process SSN.
 
300
  12&nbsp;else
 
301
  13&nbsp;  echo "Not a Social Security number!"
 
302
  14&nbsp;  # Or, ask for corrected input.
 
303
  15&nbsp;fi</PRE
 
304
></TD
 
305
></TR
 
306
></TABLE
 
307
></P
 
308
><P
 
309
>For additional examples of using the
 
310
                <B
 
311
CLASS="COMMAND"
 
312
>=~</B
 
313
> operator, see <A
 
314
HREF="contributed-scripts.html#WHX"
 
315
>Example A-29</A
 
316
>,
 
317
                <A
 
318
HREF="here-docs.html#MAILBOXGREP"
 
319
>Example 19-14</A
 
320
>, <A
 
321
HREF="contributed-scripts.html#FINDSPLIT"
 
322
>Example A-35</A
 
323
>, and <A
 
324
HREF="contributed-scripts.html#TOHTML"
 
325
>Example A-24</A
 
326
>.</P
 
327
></LI
 
328
><LI
 
329
><P
 
330
><A
 
331
NAME="PIPEFAILREF"
 
332
></A
 
333
></P
 
334
><P
 
335
>The new <TT
 
336
CLASS="OPTION"
 
337
>set -o pipefail</TT
 
338
> option is
 
339
            useful for debugging <A
 
340
HREF="special-chars.html#PIPEREF"
 
341
>pipes</A
 
342
>. If
 
343
            this option is set, then the <A
 
344
HREF="exit-status.html#EXITSTATUSREF"
 
345
>exit status</A
 
346
> of a pipe
 
347
            is the exit status of the last command in the pipe to
 
348
            <SPAN
 
349
CLASS="emphasis"
 
350
><I
 
351
CLASS="EMPHASIS"
 
352
>fail</I
 
353
></SPAN
 
354
> (return a non-zero value), rather
 
355
            than the actual final command in the pipe.</P
 
356
><P
 
357
>See <A
 
358
HREF="communications.html#FC4UPD"
 
359
>Example 16-43</A
 
360
>.</P
 
361
></LI
 
362
></UL
 
363
>
 
364
      </P
 
365
><DIV
 
366
CLASS="CAUTION"
 
367
><TABLE
 
368
CLASS="CAUTION"
 
369
WIDTH="100%"
 
370
BORDER="0"
 
371
><TR
 
372
><TD
 
373
WIDTH="25"
 
374
ALIGN="CENTER"
 
375
VALIGN="TOP"
 
376
><IMG
 
377
SRC="common/caution.png"
 
378
HSPACE="5"
 
379
ALT="Caution"></TD
 
380
><TD
 
381
ALIGN="LEFT"
 
382
VALIGN="TOP"
 
383
><P
 
384
>The update to version 3 of Bash breaks a few scripts
 
385
        that worked under earlier versions. <SPAN
 
386
CLASS="emphasis"
 
387
><I
 
388
CLASS="EMPHASIS"
 
389
>Test critical legacy
 
390
        scripts to make sure they still work!</I
 
391
></SPAN
 
392
></P
 
393
><P
 
394
>As it happens, a couple of the scripts in the
 
395
        <SPAN
 
396
CLASS="emphasis"
 
397
><I
 
398
CLASS="EMPHASIS"
 
399
>Advanced Bash Scripting Guide</I
 
400
></SPAN
 
401
> had to be
 
402
        fixed up (see <A
 
403
HREF="variables2.html#TOUT"
 
404
>Example 9-4</A
 
405
>, for instance).</P
 
406
></TD
 
407
></TR
 
408
></TABLE
 
409
></DIV
 
410
><DIV
 
411
CLASS="SECT2"
 
412
><H2
 
413
CLASS="SECT2"
 
414
><A
 
415
NAME="AEN20408"
 
416
></A
 
417
>36.2.1. Bash, version 3.1</H2
 
418
><P
 
419
>The version 3.1 update of Bash introduces a number of bugfixes
 
420
           and a few minor changes.</P
 
421
><UL
 
422
><LI
 
423
><P
 
424
>The <SPAN
 
425
CLASS="TOKEN"
 
426
>+=</SPAN
 
427
> operator is now permitted in
 
428
                in places where previously only the <SPAN
 
429
CLASS="TOKEN"
 
430
>=</SPAN
 
431
>
 
432
                assignment operator was recognized.</P
 
433
><P
 
434
><A
 
435
NAME="PLUSEQSTR"
 
436
></A
 
437
></P
 
438
><P
 
439
><TABLE
 
440
BORDER="0"
 
441
BGCOLOR="#E0E0E0"
 
442
WIDTH="90%"
 
443
><TR
 
444
><TD
 
445
><PRE
 
446
CLASS="PROGRAMLISTING"
 
447
>   1&nbsp;a=1
 
448
   2&nbsp;echo $a        # 1
 
449
   3&nbsp;
 
450
   4&nbsp;a+=5           # Won't work under versions of Bash earlier than 3.1.
 
451
   5&nbsp;echo $a        # 15
 
452
   6&nbsp;
 
453
   7&nbsp;a+=Hello
 
454
   8&nbsp;echo $a        # 15Hello</PRE
 
455
></TD
 
456
></TR
 
457
></TABLE
 
458
>
 
459
              </P
 
460
><P
 
461
>Here, <SPAN
 
462
CLASS="TOKEN"
 
463
>+=</SPAN
 
464
> functions as a <I
 
465
CLASS="FIRSTTERM"
 
466
>string
 
467
                concatenation</I
 
468
> operator. Note that its behavior
 
469
                in this particular context is different than within a
 
470
                <A
 
471
HREF="internal.html#LETREF"
 
472
>let</A
 
473
> construct.</P
 
474
><P
 
475
><TABLE
 
476
BORDER="0"
 
477
BGCOLOR="#E0E0E0"
 
478
WIDTH="90%"
 
479
><TR
 
480
><TD
 
481
><PRE
 
482
CLASS="PROGRAMLISTING"
 
483
>   1&nbsp;a=1
 
484
   2&nbsp;echo $a        # 1
 
485
   3&nbsp;
 
486
   4&nbsp;let a+=5       # Integer arithmetic, rather than string concatenation.
 
487
   5&nbsp;echo $a        # 6
 
488
   6&nbsp;
 
489
   7&nbsp;let a+=Hello   # Doesn't "add" anything to a.
 
490
   8&nbsp;echo $a        # 6</PRE
 
491
></TD
 
492
></TR
 
493
></TABLE
 
494
>
 
495
              </P
 
496
></LI
 
497
></UL
 
498
></DIV
 
499
><DIV
 
500
CLASS="SECT2"
 
501
><H2
 
502
CLASS="SECT2"
 
503
><A
 
504
NAME="AEN20426"
 
505
></A
 
506
>36.2.2. Bash, version 3.2</H2
 
507
><P
 
508
>This is pretty much a bugfix update.</P
 
509
><UL
 
510
><LI
 
511
><P
 
512
>In <A
 
513
HREF="parameter-substitution.html#PSGLOB"
 
514
><I
 
515
CLASS="FIRSTTERM"
 
516
>global</I
 
517
>
 
518
                parameter substitutions</A
 
519
>, the pattern no longer anchors
 
520
                at the start of the string.</P
 
521
></LI
 
522
><LI
 
523
><P
 
524
>The <TT
 
525
CLASS="OPTION"
 
526
>--wordexp</TT
 
527
> option disables
 
528
                <A
 
529
HREF="process-sub.html#PROCESSSUBREF"
 
530
>process substitution</A
 
531
>.</P
 
532
></LI
 
533
><LI
 
534
><P
 
535
>The <B
 
536
CLASS="COMMAND"
 
537
>=~</B
 
538
> <A
 
539
HREF="bashver3.html#REGEXMATCHREF"
 
540
>Regular Expression
 
541
                match operator</A
 
542
> no longer requires
 
543
                <A
 
544
HREF="quoting.html#QUOTINGREF"
 
545
>quoting</A
 
546
> of the
 
547
                <I
 
548
CLASS="FIRSTTERM"
 
549
>pattern</I
 
550
> within <A
 
551
HREF="tests.html#DBLBRACKETS"
 
552
>[[ ... ]]</A
 
553
>.</P
 
554
><DIV
 
555
CLASS="CAUTION"
 
556
><TABLE
 
557
CLASS="CAUTION"
 
558
WIDTH="90%"
 
559
BORDER="0"
 
560
><TR
 
561
><TD
 
562
WIDTH="25"
 
563
ALIGN="CENTER"
 
564
VALIGN="TOP"
 
565
><IMG
 
566
SRC="common/caution.png"
 
567
HSPACE="5"
 
568
ALT="Caution"></TD
 
569
><TD
 
570
ALIGN="LEFT"
 
571
VALIGN="TOP"
 
572
><P
 
573
>In fact, quoting in this context is
 
574
                <SPAN
 
575
CLASS="emphasis"
 
576
><I
 
577
CLASS="EMPHASIS"
 
578
>not</I
 
579
></SPAN
 
580
> advisable as it may
 
581
                cause <I
 
582
CLASS="FIRSTTERM"
 
583
>regex</I
 
584
> evaluation to fail.
 
585
                Chet Ramey states in the <A
 
586
HREF="biblio.html#BASHFAQ"
 
587
>Bash
 
588
                FAQ</A
 
589
> that quoting explicitly disables regex evaluation.
 
590
                See also the <A
 
591
HREF="https://bugs.launchpad.net/ubuntu-website/+bug/109931"
 
592
TARGET="_top"
 
593
>               Ubuntu Bug List</A
 
594
> and <A
 
595
HREF="http://en.wikinerds.org/index.php/Bash_syntax_and_semantics"
 
596
TARGET="_top"
 
597
>               Wikinerds on Bash syntax</A
 
598
>.</P
 
599
><P
 
600
>Setting <SPAN
 
601
CLASS="emphasis"
 
602
><I
 
603
CLASS="EMPHASIS"
 
604
>shopt -s compat31</I
 
605
></SPAN
 
606
>
 
607
                  in a script causes reversion to the original
 
608
                  behavior.</P
 
609
></TD
 
610
></TR
 
611
></TABLE
 
612
></DIV
 
613
></LI
 
614
></UL
 
615
></DIV
 
616
></DIV
 
617
><DIV
 
618
CLASS="NAVFOOTER"
 
619
><HR
 
620
ALIGN="LEFT"
 
621
WIDTH="100%"><TABLE
 
622
SUMMARY="Footer navigation table"
 
623
WIDTH="100%"
 
624
BORDER="0"
 
625
CELLPADDING="0"
 
626
CELLSPACING="0"
 
627
><TR
 
628
><TD
 
629
WIDTH="33%"
 
630
ALIGN="left"
 
631
VALIGN="top"
 
632
><A
 
633
HREF="bash2.html"
 
634
ACCESSKEY="P"
 
635
>Prev</A
 
636
></TD
 
637
><TD
 
638
WIDTH="34%"
 
639
ALIGN="center"
 
640
VALIGN="top"
 
641
><A
 
642
HREF="index.html"
 
643
ACCESSKEY="H"
 
644
>Home</A
 
645
></TD
 
646
><TD
 
647
WIDTH="33%"
 
648
ALIGN="right"
 
649
VALIGN="top"
 
650
><A
 
651
HREF="bashver4.html"
 
652
ACCESSKEY="N"
 
653
>Next</A
 
654
></TD
 
655
></TR
 
656
><TR
 
657
><TD
 
658
WIDTH="33%"
 
659
ALIGN="left"
 
660
VALIGN="top"
 
661
>Bash, versions 2, 3, and 4</TD
 
662
><TD
 
663
WIDTH="34%"
 
664
ALIGN="center"
 
665
VALIGN="top"
 
666
><A
 
667
HREF="bash2.html"
 
668
ACCESSKEY="U"
 
669
>Up</A
 
670
></TD
 
671
><TD
 
672
WIDTH="33%"
 
673
ALIGN="right"
 
674
VALIGN="top"
 
675
>Bash, version 4</TD
 
676
></TR
 
677
></TABLE
 
678
></DIV
 
679
></BODY
 
680
></HTML
 
681
>
 
 
b'\\ No newline at end of file'