CHANGE LOG & Release History This file is available on-line at http://personal.riverusers.com/~thegrendel/Change.log ================================================================== Current version = 5.4 http://personal.riverusers.com/~thegrendel/abs-guide-5.4.tar.bz2 http://personal.riverusers.com/~thegrendel/abs-guide.pdf -------------------------------------------------------------------- News: "music.sh" example script added. "nim.sh" example script added. "UseGetOpt.sh" script added. ==================================================================== Version 5.4, Angleberry release 05/21/08 1) In "Tests" chapter: In "Test Constructs" section: Rewrote "arithmetic expansion" discussion and in-line example. Removed "if-echo" construct example (too confusing). In "File test Operators" section: At "-b" entry, added short usage example. Added a few lines to "arith-tests.sh" example. In "Test Comparison Operators" section: At "-z" entry, added short in-line example. 2) In "Introduction to Variables and Parameters" chapter: In "Variable Substitution" section, Added in-line example to "warning" about unassigned variables. Minor cleanups to introductory text. In "Special Variable Types" section, at discussion of "du" overflow, noted that this has been fixed as of kernel 2.6.23. (Thank you, Mauro Giachero, for pointing this out.) 3) In "Loops and Branches" chapter: Added in-line example of a function providing the [list] for a "for" loop, using command substitution. At "until" loops section, expanded "ex27.sh" example script. 4) In "Functions" chapter: Added comment to the effect that a function call is equivalent to a command. 5) In "Internal Commands and Builtins" chapter: At footnote to "getopts" entry, fixed typo. At "let" entry, added to "ex46.sh" example to include C-style increment, decrement, and trinary operators. 6) In "External Commands" chapter: In "Text Processing" section: At "recode" entry, fixed typo (removed extraneous ">"). In "Math Commands" section: At "factor" entry, added "primes2.sh" example script. In "Time/Date Commands" section: At "sleep" entry, fixed typo in usage example. At "date" entry, fixup: delete "generate six-digit random integers" && add explanation in In "File and Archiving Commands" section: At "more/less" entry, added paragraph (with link) explaining that "less" displays man page source. At "diff3" entry, added listing for "merge." In "Miscellaneous Commands" section: At "tee" entry, fixed typo (siponing -> siphoning). At "m4" entry, clarified footnote definition of "macro." At "getopt" entry, added Peggy Russell's note about the necessity of "eval." At "yes" entry, Added a use (of sorts) for parsed-variable echoing capability. Cleared up ambiguity about "yes" parsing variables (it doesn't). Added simple emulation of "yes" in a script function. In "Communications Commands" section: Added "mailstats" command. In "Terminal Commands" section: Added "resize" entry. At "tput" entry, added listing of some interesting options. 7) In "Arrays" chapter: Fixed error and typos in "array-strops.sh" example. Added comment line to "ex67.sh" example about ${Array[$element]}. (Thank you Juan Bellon, for the the heads-up on the above!) Revisions and fixups to "empty-array.sh" example script (Thank you, Nathan Coulter!) 8) In "Variables Revisited" chapter: In "Manipulating Strings" section: Minor rewrites to clarify meaning ("strip" --> "delete" ... etc.) In "Indirect References" section: Complete rewrite of introduction for additional clarity. Added material to "ind-ref.sh" example. In "Typing Variables" section: Added short in-line example to footnote. 9) In the "Shell Wrappers" section of "Miscellany" chapter: Fixed a typo in "ex3.sh" example ("This match lines ..." --> "This matches lines ..."). Added mention of Martin Matusiak's "undvd" shell wrapper script. Added mention of Itzchak Rehberg's "Ext3Undel" package. 10) In "Escaping" section of "Quoting" Chapter: Minor fixups and clarifications. 11) In "/dev" section of "/dev and /proc" chapter: Added "music.sh" example script (plays music!). Thanks, Antonio Macchi!) Added links / short explanations to pseudo-device listing. 12) Slight stylistic revisions to "Credits" section "Endnotes" Chapter. 13) In "Debugging" chapter: Added explanations and references to listing of internal variables new to version 3 of Bash. 14) In "Restricted Shells" chapter: Cleaned up markup tags (changed to ). 15) In "Assorted Tips" section of "Miscellany" chapter: Added "progress-bar.sh" example script. (Thanks, Dotan Barak!) At "rcs" entry, correction: added space to "# $Id" in 2 places. 16) In "Special Characters" chapter: At "whitespace" entry, added link to "[:space:]" POSIX character class. 17) In "Contributed Scripts" appendix: Added "maned.sh" -- man page editor example script. Added "sd.sh" -- Standard Deviation example script. Added "nim.sh" -- game of Nim example script. Added Peggy Russell's "UseGetOpt.sh" example script (thanks!). Slight fixup to "tohtml.sh" (more accurate conversion). 18) In "Writing Scripts" section of "Exercises" appendix: Added "Craps" exercise. Added "Tic-tac-toe" exercise. Added "Banner" exercise. Added "Table of Logarithms" exercise. 19) In "Bibliography" section: Added entry+link to John Lion's _Commentary_ (still da bestest UNIX reference). 20) Cleanups/fixups to main text, appendices, and script examples where appropriate . . . especially to older scripts. Version 5.3, Goldenberry release 05/11/08 1) In "Special Variable Types" section of "Introduction to Variables and Fixed exit-status error in second "shift-past.sh" example. (Thank you, E. Choroba!) At "#" entry, added "quoted" to "escaped" for "#" in non-comment lines. Added a number of missing "Ctl-?" entries. Now, the entire alphabet is complete . At "Ctl-N" entry, added footnote about history buffer. 2) In "Tests" chapter: In "Test Constructs" section: At [[ double brackets ]] construct, added discussion and example on arithmetic evaluation of octal and hex constants within [[ ... ]]. (Thank you, Moritz Gronbach!) Consolidated entire [[ ... ]] topic into a single . 3) In "Text Processing" section of "External Commands" Chapter: Added "cw-solver.sh" (crossword puzzle solver) example script. 4) In "System and Administrative Commands" chapter: At "lockfile" entry: Updated in-line example per suggestion of E. Choroba. Added info to footnote defining "semaphore." 5) In "Internal Commands and Builtins" chapter: At "read" entry, appended Antonio Macchi's suggestions to "arrow-detect.sh" example. 6) In "Quoting Variables" section of "Quoting" chapter: Added simple in-line example. 7) In "Debugging" chapter: Changed note defining 'signal' into a sidebar and removed superfluous comma. 8) In "Gotchas" chapter: Added item about unintended consequences of preserving whitespace within a variable. (Thank you, Claus Tirel, for inspiring me to do this.) 9) In "Assorted Tips" section of "Miscellany" chapter: At return value trickery discussion, added Caution about only one "echo" statement in a function. 10) In "Operator Precedence" section "Miscellany" chapter: Fixed an error in the table (!= is not a "combination assignment" operator. 11) In "Contributed Scripts" appendix: Added "Petals Around the Rose" example script. (Thank you, Serghey Rodin!) Modified "basics-reviewed.bash" script, per contribution of Cliff Bamford. (Many thanks!) In "basics-reviewed.bash" script, fixed two typos. Added very long and complex "qky.sh" (Perquackey-type game) script. 12) In "Exit Codes With Special Meanings" appendix: Added footnote about previously unused exit codes in the 64-78 range now allocated. (Thank you, Greg Metcalfe, for pointing this out.) 13) In "Bibliography" section: Added reference/link to Penguin Pete's site. 14) In "Exercise" appendix: Added humorous preface. 15) Cleanups/fixups to main text, appendices, and script examples where appropriate. Version 5.2, Silverberry release 03/16/08 1) In the "Starting Off With a Sha-Bang" chapter: Added footnote about "#!/bin/env bash" ... Added footnote about alternate spellings of "sha-bang." 2) In "Why Shell Programming?" chapter, Put "When not to use shell scripts" into a sidebar. 3) In "Special Characters" chapter: Added short introductory paragraph ("meta-meaning" ... etc.) At "-" entry, added "cat -" inline example. At "--" entry, added tip about removing dash-prefixed file names. At "Ctl-Z" entry, added MS-DOS EOF info. At "pipe" sidebar, added "philtre" footnote. Cleaned up some of the markup. 4) In "Internal Commands and Builtins" chapter: At "eval" entry, modified "ex43.sh" example at the suggestion of E. Choroba. (Thanks!) 5) In "Basic Commands" section of "External Commands" Chapter: At "rm" entry, reworked note about deleting dash-prefixed filenames. 6) In "Introduction to Variables and Parameters" chapter: At "shift entry", added comments to "shift-past.sh" example at the suggestion of Eleni Fragkiadaki (thanks!). 7) In "Variable Substitution" section of "Introduction to Variables: At discussion of "variable name," added brief definition of a "pointer" to footnote. 8) In "Bash Variables are Untyped" section of "Introduction to Variables" Added reference to "declare / typeset." 9) In "Miscellaneous Commands" section of "External Commands" Chapter: Added "xmessage" entry. Added "zenity" entry. 10) In "I/O Redirection" chapter: At "Using Exec" section, Added comment to "upperconv.sh" example, noting that 'cat' is unnecessary. (Thank you, Walter Brameld IV!) 11) In "Functions" chapter: Rewrote introduction to subsection on recursion by changing a footnote to a sidebar. Also added "recursion-demo.sh" example script. In subsection on recursion without using local variables, added "fibo.sh" example. Added note, per Yan Chen's commentary on redefinition of the same function. 12) In "Job Control Commands" section of "Internal Commands and Builtins" chapter: At "wait" entry, added Walter Brameld's explanation of script-in-background hang. (Thanks!) 13) In "Operators" subsection of "Operations and Related Topics" chapter: Moved "!" from bitwise to logical operators. Made capitalization of operators more consistent. (Thanks, Sebastian Arming, for bringing these to my attention.) 14) In "Time/Date Commands" section of "External Commands" chapter: At "date" entry, added "date-calc.sh" example. (Thank you, Nathan Coulter!) 15) In "File and Archiving Commands" section of "External Commands" Chapter: Added "lzma" entry. 16) "System and Administrative Commands" chapter: At "lockfile" entry, added footnote defining "semaphore." Reworked "env" entry. 17) In "Contributed Scripts" appendix: Added "homework.sh" example. Added Patsie's "tree2.sh" example. 18) In the "Sed and Awk Micro-primer" appendix: In "Awk" section, added example of "$0" (field #0). 19) In "Bash, versions 2 and 3" chapter: Fixed a typo in first paragraph ("number of bug" -> "number of bugs"). Added cautionary note about =~ regex match operator incompatibilities in version 3.2 update of Bash. (Thanks, Chris Bainbridge, for the heads up!) Added Bash, version 3.2 subsection. 20) In "Assorted Tips" section of "Miscellany" chapter: At "Passing an array to a function" entry, fixed typo: "bag of trick" --> "bag of tricks" Created a new sub-subsection for the topic of widgets. Added 'xmessage' and 'zenity' commands, with in-line examples. 21) In "Parameter Substitution" section of "Variables Revisited" chapter: Fixed two typos (missing left curly bracket). (Thank you, Jean-Michel Vallat, for pointing this out.) 22) In "Typing Variables" section of "Variables Revisited" chapter: Added footnote defining "typing." 23) In "Optimizations" section of "Miscellany" chapter: Added footnote about using functions. 24) In "Bibliography" section: Minor rewrites and updates of entries. Updated a few stale URLs. 25) In "ASCII Table" appendix: Replaced "ascii.c" with "ascii.sh" script contributed by Sebastian Arming. (Thanks!) 26) In "Writing Scripts" section of "Exercises" appendix: Revised "safe delete" exercise. 27) In" DOS Batch Files" appendix: Added footnote about rewriting the example batch file. 28) More cleanups/fixups/additions to Index. 29) More cleanups/fixups to main text, appendices, and examples where appropriate. Version 5.1, Lingonberry release 11/10/07 (The usual fixups after a .0 release ...) 1) In "Special Characters" chapter: At "-" (dash) entry, added default parameter (parameter substitution). At "+" (plus) entry, added alternate parameter (parameter substitution). At "," (comma) entry, added footnote defining "operator." Added "Ctl-Y" entry. (Thank you, Stuart J. Browne!) 2) In "Complex Commands" section of "External Commands" Chapter: At "xargs" entry: Added another example of "xargs -0" usage. Added note about sequential processing of arguments passed. 3) In "File and Archive Commands" section of "External Commands" Chapter: At "tar" entry, added "--after-date" option. 4) In "Manipulating Strings" section of "Variables Revisited" chapter: At "${string:position:length}" entry, added "rand-string.sh" example script. 5) In "File and Archiving Commands" section of "External Commands" Chapter: At "sum/cksum/md5sum/sha1sum" entry, added note about enhanced "sha1sum" commands. At "csplit" entry, added "splitcopy.sh" example. 6) In "Internal Commands and Builtins" chapter: At "eval" entry, added E. Choroba's in-line example (Thanks!) 7) In "/proc" section of "/dev and /proc" chapter: Output fixup for "get-commandline.sh" inline example. (Thank you, Han Holl!) 8) In "Arrays" chapter: Added "ex68a.sh" example, Jared Martin's improved version of "ex68.sh" ... 9) "System and Administrative Commands" chapter: Added "mkisofs" entry. 10) In "Miscellany" chapter: Added much-needed "Operator Precedence" section, with *table* and examples. 11) In "Miscellaneous Commands" section of "External Commands" chapter: At "jot" entry, added additional material (including random sequence output). 12) In "Subshells" chapter: Enhanced "subshell.sh" example to show that changes to a global variable inside a subshell do not affect its value outside the subshell. 13) In "$RANDOM" section of "Variables Revisited" chapter: Added "brownian.sh" example. 14) In the "Regular Expressions" chapter, Added footnote defining "meta-meaning." 15) In "Assorted Tips" section of "Miscellany" chapter: Added entry showing how to access a variable in a subshell _outside_ the subshell. 16) In" DOS Batch Files" appendix: corrected Ted Davis URL (Thank you, Rik Kabel!) 17) In "Bibliography" section: Fixed URL on "Ted Davis' Shell Scripts on the PC" site. (Thanks, Rik Kabel!) 18) In "Mirror Sites" appendix: Removed dead link to Sunsite (ibiblio.org). Apparently they no longer mirror the ABS Guide. 19) In "Revision History" appendix: Added a copy on an e-mail shortly after release of version 0.1 of the ABS Guide. 20) In "Copyright" appendix: Liberalized the license terms to *permit* modified or derivative versions of the book. 21) Changed "Sony Librie" references to include the newer Sony PRS-500/505 device. 22) More cleanups/fixups/additions to Index. 23) More cleanups/fixups to main text and examples where appropriate. Version 5.0, Serviceberry release 06/24/07 1) In "Special Characters" chapter: Added note to "ex8.sh" example script at the suggestion of Hans-Joerg Diers. (Thanks!) At "-" entry, added xref to example for "--" option flag. At "-" entry, added discussion of end-of-options for a builtin for the "--" flag. (Thank you again, Hans-Joerg Diers.) 2) In "File and Archiving Commands" section of "External Commands" Chapter: Expanded "make" entry. 3) In "Text Processing" section of "External Commands" Chapter: At "grep" entry, added "from.sh" example. 4) In "Process Substitution" chapter: New introduction. Changed "Command substitution template" heading to corrected "Process substitution template." 5) In "I/O" Redirection chapter: Broke up large usage example at beginning of chapter into separate parts. Much more useful to link to this way. 6) "System and Administrative Commands" chapter: At "newgrp" entry, added Kurt Glaesemann's note. 7) In "Arrays" chapter: Changed "array operations on variables" note to a sidebar. 8) In "Loops and Branches" chapter: More explanation of omitting test brackets in "while" loop. More material on "while-read" construct. Added Shakespeare epigraph. 9) In "Parameter Substitution" section of "Variables Revisited" chapter: Clarified substring removal operations. 10) In "/dev" section of "/dev and /proc" chapter: Moved "socket" definition from a footnote to a sidebar. 11) In "Endnotes" Chapter: Added "Disclaimer" section. 12) In "Bibliography" section: Added entry for Tim Waugh's "xmlto" Bash script. 13) In "Copyright" appendix: Added anti-lawsuit waiver. Minor fixups and additions. 14) In "Important Files" appendix, Added /etc/sysconfig/hwconf entry. 15) In "Contributed Scripts" appendix: Added JuanJo Ciarlante's "insertion-sort.bash" example (thanks!). 16) In "Reference Cards" appendix: Added entries to "Miscellaneous Constructs" table (at Double Parentheses). 17) Added "ASCII Table" appendix. 18) Added cross-linked index/glossary. Much needed! 19) Fixed URL for pdf version of document at mirror site. 20) Reformatted many of the epigraphs (quotations) for improved appearance. 21) Minor text and script cleanups, as appropriate. Version 4.3, Inkberry release 04/29/07 1) In "Special Characters" chapter: At "| / pipes" entry, added UNIX FAQ note in sidebar. (Thank you, Nick Battle, for doing the research on this.) At "ctl-H" entry, added commentary, per Constantin Hagemeier's suggestions. 2) In "I/O" Redirection chapter: In introductory in-line example, Added note that "&>>filename" fails. (Thank you, David Perlman.) In "Applications" section, Fixed up formatting/comments of "logevents.sh" example script. 3) Indented some of the case statment conditions in text for better readability. 4) In "Arrays" chapter: Fixed erroneous comment in "array-assign.bash" example script. (Thank you, Manfred Schwarb, for pointing this out.) 5) In "Internal Commands and Builtins" chapter: At "read" entry, added a section to the "read-novar.sh" example script. Clarified user instructions in "read-r.sh" example script. (Thank you, Paul O'Malley.) At "export" entry, added general definition of the term "export" in a footnote. 6) In "Variable Substitution" section of "Introduction to Variables and Parameters" chapter: Added footnote about "rvalue" and "lvalue." 7) In "Internal Variables" section of "Variables Revisited" chapter: At "$IFS" entry, revised first set of usage examples at the suggestion of Christian Laubscher. (Thanks!) Modified "$GROUPS" entry at the suggestion of Dan Stromberg. (Thanks!) 8) In "Loops and Branches" chapter: Added a paragraph at end of chapter on which type of loop to use. Modified "ex24.sh" script for better functionality. In "Loop Control" section of "Loops and Branches" chapter: Added James "Mike" Conley's fix of Jean Helou's code. (Thanks!) 9) In "Complex Commands" section of "External Commands" Chapter: At "find" entry, slight revision to "ex57.sh" example script. (Thanks, Robbie Morrison.) 10) In "File and Archiving Commands" section of "External Commands" Chapter: Added note for clarification to "ex48.sh" example. (Thanks, Evan.) 11) In "Text Processing" section of "External Commands" Chapter: At "grep" entry, added "--color" and "-o" options discussion. (Thank you, Benno Schulenberg.) 12) In the "Regular Expressions" chapter, At asterisk (*) entry, fixed error in example. (Thank you, Benno Schulenberg.) 13) In "Here Strings" section of "Here Documents" chapter: Added discussion of bracketed-variable problem in "commentblock.sh" example. (Thank you, Kurt Pfeifle!) 14) In "Communications Commands" section of "External Commands" chapter: At "wget" entry, added discussion of "-c" option. 15) "System and Administrative Commands" chapter: At "chkconfig" entry, clarification to include system services. (Thank you, Dan.) 16) In "Bash, version 3" section of "Bash, versions 2 and 3" chapter: Removed a "the the" typo. 17) In "Subshells" chapter: Added definition of "scope" in a sidebar. 18) In "/dev and /proc" chapter: Added "get-commandline.sh" in-line example. 19) In "Gotchas" chapter: At "suid" entry, modified footnote, per suggestion of Dan Stromberg. 20) In the "Security Issues Section" of the "Miscellany" chapter: Added a subsection on "Writing Secure Shell Scripts". (Thank you, Dan Stromberg!) 21) In "Contributed Scripts" appendix: Added "pad.sh" script. Added "soundcard-on.sh" script. Added "find-splitpara.sh" script. Added "tohtml.sh" script. Shortened a couple of overlength lines in "nightly-backup.sh" and "ftpget.sh" scripts for better print formatting. 22) In "Analyzing Scripts" section of "Exercises" appendix: Added Nathan Coulter's code snippet (thanks!). 23) In "Writing Scripts" section of "Exercises" appendix: Added "Monitoring a User" exercise to "Intermediate" section. Removed "Converting a file to HTML" exercise (since I included a script that does this ). 24) In "Copyright" appendix: Added URL for Chinese translation. 25) In "Bibliography" section: Added Fritz Mehnert's Bash-related projects. 26) In README file: Fixed typo. (Thanks, Yuval Langer, for pointing it out. Added short "sed" script for reverting example scripts to original executable version. 27) Reverted to tagging "C" (C language) references with "" tags for additional clarity. Version 4.2, Sparkleberry release 12/10/06 1) In "Why Shell Programming?" chapter, added paragraph with Mayer quote about a "useful" language. 2) In the "Starting Off With a Sha-Bang" chapter: Minor editing of footnotes. 3) In "Basic Commands" section of "External Commands" Chapter: At "ls" entry, added tip about exit status. At "chmod" entry, discussion of "chmod 444" and "chmod 111" and "chmod 000"(for a directory) added to in-line example. 4) In "Math Commands" section of "External Commands" chapter: Modified "alt-bc.sh" example script to eliminate global variable. 5) In "Complex Commands" section of "External Commands" Chapter: At "find" entry, added "finding suid files" inline example. 6) In "Quoting" Chapter: Correct "Encapsulating '!' ..." footnote. (Thank you, Geoff Lee.) In "Escaping" section: Modified "escaped.sh" example script to show effect of escaping a newline. 7) In "Internal Variables" section of "Variables Revisited" chapter: At "$SHLVL" entry, added footnote defining "nesting." 8) In "Text Processing" section of "External Commands" Chapter: Added "texexec" entry. 9) In "Loops and Branches" chapter: In "while loops" section, Added a paragraph specially dedicated to "while-read" loops. Added use of function within test brackets of loop. 10) In "Redirected Code Blocks" section of "I/O Redirection" chapter: Added using a "here document" to feed into the stdin of a while-read loop. (Thank you, Albert Siersema!) 11) In "Numerical Constants" section of "Operations and Related Topics" In "numbers.sh" example, added "echo ((0x...))" construct. 12) In "Internal Commands and Builtins" chapter: In "Network" subsection, added "ip" entry, and Juan Nicolas Ruiz's "ip.sh" example script. (Thank you!) At "read" entry: Modified "arrow-detect.sh" example script per Mark Alexander (Thanks!) At "export" entry: Reordered the intro, with link. At "eval" entry: Added "echo-params" example script. 13) In "Arrays" chapter: Fixed comments in "bubble.sh" example (Paulo Aragao's alternative). (Thank you, C.Y. Hunt!) 14) "System and Administrative Commands" chapter: Added usage examples at "lsof" entry. 15) In "/dev and /proc" chapter: In "/dev" section, Added example of "head -1 /dev/hdc" to check whether CD is in drive. In "/proc" section, Added "cpuinfo" sub-example. Added "fgrep Mem /proc/meminfo" Fixed /proc/cpuinfo example (FC6 breaks old one!) Fixed /proc/bus/usb/devices example (FC6 breaks old one!) 16) In "Miscellaneous Commands" section of "External Commands" chapter: At "dd" entry, added material. At "hexdump" entry, added usage example. 17) In "Gotchas" chapter: Added (very short) intro paragraph. 18) In "Complex Functions and Function Complexities" section of "Functions" Fixed up "max.sh" example script (can't use negative function return values any more!) 19) In "Writing Scripts" section of "Exercises" appendix: Fixed typo in "Square Roots" exercise. 20) In "Command-Line Options" appendix: Fixed GNU standards page URL (Thank you, Kevin Hunsaker). 21) In "Bibliography" section: Added entry for "Pixelbeat command-line reference." Added entry for "dd" thread on Linux Questions. 22) Fixed embarrassing typo (missing space) on title page. 23) Changed tags to more appropriate in the title listing of many examples. 24) Fixed up "split" links in List of Examples on title page. 25) Parameterized modem port in "ex24.sh" example. 26) Current revision's Major Project: shorten overlength lines for formatting reasons. "days-between.sh" example [also Fixed misspelling (permissable --> permissible).] "Hash.lib" example "usb.sh" example "is_spammer.bash" example "wgetter2.bash" example "bashpodder.sh" example "gcd.sh" example "random-between.sh" example "ex36.sh" example "ex41.sh" example "ex64.sh" example "rnd.sh" example "de-rpm.sh" example "and-list2.sh" example "fc4upd.sh" example "iscan.sh" example "cccl" example "horserace.sh" example "factr.sh" example "letter-count2.sh" example "bashrc" example Alan Cox's and Lee Maschmeyers' examples in "Special Characters" chapter. Done (I think)! Version 4.1, Waxberry release. 10/08/06 1) In the "Starting Off With a Sha-Bang" chapter: Added Sven Mascheck's note to the footnote on magic numbers in 4.2 BSD. (Thanks, Sven.) 2) In "Special Characters" chapter: At "$$" entry, in footnote, added definition of a "process." 3) In "Here Strings" section of "Here Documents" chapter: Added short intro example. Thank you, Sebastian Kaminski, for the suggestion. 4) In "Functions" chapter: Added note about single-line functions, with warning that a semicolon must terminate the final command in such a function. Embedded Christopher Head's function definition snippet in S.C.'s inline example. 5) "System and Administrative Commands" chapter: At "stat" entry, added in-line example script showing setting of file-descriptive variables. (Thank you, Joël Bourquard, for the suggestion.) At "netstat" entry, added note about "netstat -lptu." 6) In "Communications Commands" section of "External Commands" chapter: At "rsync" entry, changed final paragraph to a "note." 7) In "Text Processing" section of "External Commands" Chapter: At "tail" entry, noted that "tail -$LINES" is now deprecated, and corrected examples. Also cleaned up "head" references and examples, as above. At "tr" entry, in sidebar, removed misleading statement about mandatory quoting of letter ranges within brackets. (Thank you, Omair Eshkenazi, for pointing this out.) At "nl" entry, changed "cat -n" reference to "cat -b" for clarity. (Thank you, Omair Eshkenazi, for pointing this out.) 8) In "Special Variable Types" section of "Introduction to Variables and Added short definition of "child process" to note about exporting variable to child processes. At "shift" entry, added paragraph and short in-line example code listing on passing a numerical parameter indicating how many positions to shift. 9) In "Subshells" chapter: Added definition of "subshell" in a sidebar box. Added in-line example, showing subshell with "ps." Added footnote that "exec" does not fork off a subprocess/subshell. At "dedicated environment" inline example, noted that the "exit" only terminates the subshell, not the parent process. Removed "note" markers from paragraph about variables in a subshell not being visible outside the subshell. Added note, with example, about use of "$BASH_SUBSHELL" -- but _not_ "$SHLVL" to indicate level of nesting within a subshell. 10) In "Loops and Branches" chapter: Corrected minor grammar error in "findstring.sh" example. Added footnote defining "iteration." Added (needed!) spaces in definitions of "while" and "until" loops. Noted that "while loop" uses previously-discussed "test brackets," and can use double-brackets construct. 11) In "Internal Commands and Builtins" chapter: At "unset" entry, added string test to "unset.sh" example. At "exit" entry, added note that this command may also terminate a subshell. At "exit" entry, added footnote that this command *only* terminates the process it is running within. At footnote to "hash" entry, gave a couple of synonyms for "algorithm." 12) In "Internal Variables" section of "Variables Revisited" chapter: At "$SHLVL" entry, added note that this variable not affected by subshells. At "$!" entry, added Matthew Sage's "hanging job" example (thank you!). 13) In "/proc" section of "/dev and /proc" chapter: Added "cat /proc/acpi/battery/BAT0/info" to introductory usage examples. Added note about controlling peripherals by sending commands to /proc. 14) In "Miscellaneous Commands" section of "External Commands" chapter: At "mkfifo" entry, added Omair Eshkenazi's example script (thanks!). 15) In "Time/Date Commands" section of "External Commands" chapter: At "batch" entry, added short definition of "batch processing." 16) In "Manipulating Strings" section of "Variables Revisited" chapter: At "${string%substring}" entry, added Rory Winston's usage example (thanks!). 17) In "Colorizing Scripts" section of "Miscellany" chapter: Modified "Draw-box.sh" example per suggestions of Jim Angstadt (thanks!). 18) In "Of Zeroes and Nulls" chapter Added comments to "ex73.sh" and "ramdisk.sh" example scripts. 19) In "Contributed Scripts" appendix: In "days-between.sh" example, Corrected Gauss' Formula comment (reference date is March 1, 1600, *not* January 1). Corrected broken link in above comment. (Thank you, Nick Alexeev, for the pointers.) Added "nightly-backup.sh" example. (Thank you, Richard Neill.) 20) In the "Sed and Awk Micro-primer" appendix: Added note about other "sed" delimiters, such as "%" ... (Thank you, Omair Eshkenazi.) 21) In "Analyzing Scripts" section of "Exercises" appendix: Added Rory Winston's one-liner script (thanks!). 22) In "Writing Scripts" section of "Exercises" appendix: In EASY section, added "Self-reproducing" script. In DIFFICULT section, added "Cross Reference" script. added "Square Roots" script. 23) In "Bibliography" section: At reference and URL for Col Needham's original IBDB scripts, Noted that the link no longer works. (Thank you, Colin Brace, for pointing this out.) 24) In "Assorted Tips" section of "Miscellany" chapter: Added "pseudo-code" entry. 25) In "Copyright" appendix: Added footnote stating author's intention to commit the book to the Public Domain in 2014. 26) Miscellaneous: Added footnote defining "deprecate." Version 4.0, Winterberry release. 06/18/06 1) "System and Administrative Commands" chapter: Added "gnome-mount" entry. Modified "command" entry to eliminate ambiguity. At "uname" entry, reordered usage example. At "watch" entry, noted that piping output of "watch command" to "grep" doesn't work. In "Filesystem" subsection, At "lockfile" entry, additional comment in in-line example script. In "Job Control" subsection, Added "killall" entry. At "nice" entry, elaborated on "renice," "snice," and "skill." 2) In "Communications Commands" section of "External Commands" chapter: At "ping" entry, added in-line example script. 3) In "Text Processing" section of "External Commands" Chapter: At "tsort" entry, added material. 4) In "Arrays" chapter: Noted an exception to 'array2=( "${array1[@]}" )' array copying method. (Thank you, Jochen, DeSmet.) Extended "empty-array.sh" (Thank you, Omair Eshkenazi.) 5) In "Tests" chapter: In "Test Constructs" section: Fixed comment typos in "broken-links.sh" example. (Thank you, Omair Eshkenazi.) Added material to note about "test" builtin and /usr/bin/test not being equivalent. In "Other Comparison Operators" section: Rewrote the (short) intro. In "Test Your Knowledge of Tests" section: Updated intro to example snippet. 6) In "$RANDOM" section of "Variables Revisited" chapter: Fixed typo in comment in Jipe's in-line example. Added comment to "random-between.sh" example. (Thank you, Omair Eshkenazi, for both of the above.) 7) In the "Security Issues Section" of the "Miscellany" chapter: Fixed typo in second paragraph. (Thank you, Omair Eshkenazi.) 8) In "List Constructs" chapter: Modified "and list" setting variable to default value in-line example. (Thank you, Omair Eshkenazi.) 9) In "Job Control Commands" section of "Internal Commands and Builtins" chapter: At "kill" entry, added comment about additional file giving signal listing. 10) In "Time/Date Commands" section of "External Commands" chapter: At "touch" entry, added tip about not overwriting files. 11) In "Internal Commands and Builtins" chapter: Added short usage examples to "true" and "false" entries. 12) In "Bash, version 3" section of "Bash, versions 2 and 3" chapter: Added "pipefail" option. Also added this to table in "Options" chapter. At {x..y} "braces expansion operator entry, added a simple "echo" using this. (Thank you, Damon Puncer, for the suggestion.) 13) In "File and Archiving Commands" section of "External Commands" Chapter: At "diff" entry, added note about "diffstat." Moved "sum/cksum/md5sum/sha1sum" and "shred" entries to "Encoding and Encryption" subsection. 14) In "Contributed Scripts" appendix: Added "ha.sh" hashing script. (Thank you, Oliver Beckstein.) Added comments to "fifo.sh" script. (Thank you, Omair Eshkenazi.) More explicit reference to Mark Moraes copyright before his two scripts. 15) Moved "Here Documents" chapter from "Beyond the Basics" section to "Advanced Topics" section. 16) Moved "I/O Redirection" chapter from "Beyond the Basics" section to "Advanced Topics" section. 17) In "/dev" section of "/dev and /proc" chapter: Added material to "socket" footnote. 18) Split off the three "Command" chapters into a different Part. Put an alphabetical command cross-reference into the Introduction to that Part. >> This is a major reorganization of the document. << 19) In "Special Characters" chapter: Added "extended brace expansion" (Bash 3+) entry. Added "{} -- placeholder for text after "xargs -i" . . . 20) In "Reference Cards" appendix: In "Miscellaneous Constructs" table: Added "extended brace expansion" (Bash 3+) entry. Added "{}" (text replacement) entry. Added more hypertext links. Cleanups. 21) Delineated all references to "root user" with tags. 22) Changed many of the tags in the document to more appropriate , , and , etc. 23) Changed certain of the tags to the more appropriate . 24) Various minor fixups on example scripts. Version 3.9 Spiceberry release, 05/15/06 1) In the "Starting Off With a Sha-Bang" chapter: Added footnote that when launching a script from Bash, the #! isn't strictly necessary. (Thank you, Diane Holt, for bringing this to my attention.) 2) In "I/O Redirection" chapter: At introduction to chapter, Added explanatory examples in introductory in-line code block. At "Using Exec" section, Added brief explanation of different effects of "exec N > filename" and "N > filename." (Thank you, Ahmed Darwish, for both of the above.) 3) In "Special Characters" chapter: At "$" entry, added an additional usage example. At "$$" entry, added footnote explaining of what a PID is. At redirection operators entry, added "<>" description. At "-" entry, fixup on "bunzip2" example. (Thanks, Roman.) 4) In "Miscellaneous Commands" section of "External Commands" chapter: At "yes" entry, added parsing of variables. 5) In "File and Archiving Commands" section of "External Commands" Chapter: At "gzip" entry, added note about "-c" option. 6) In "Manipulating Strings" section of "Variables Revisited" chapter: At "${string%%substring}" entry, added "ra2ogg.sh" example script. 7) In "Bash, version 3" section of "Bash, versions 2 and 3" chapter Added "Bash, version 3.1" subsection. Entry for "+=" operator. 8) In "Subshells" chapter: Modified final note about command list within curly brackets, per suggestion of Andreas Kühne. 9) In "Gotchas" chapter: Converted separate entries to bulleted-item list. Added entry for error in leaving out termination semicolon in command block within curly braces. (Thank you, Andreas Kühne.) 10) In "Writing Scripts" section of "Exercises" appendix: Added "Checking whether a process is still running" exercise ("Easy" section). 11) "System and Administrative Commands" chapter: Minor revision of "strace" entry. Added "ltrace" entry. Added "lspci" entry. 12) In "Contributed Scripts" appendix: Minor modification to "life.sh" script, to check for missing startfile. 13) In "Reference Cards" appendix: Fixed up error in "Miscellaneous Constructs" table (terminating semicolon in command list within curly brackets). (Thank you, Andreas Kühne.) 14) In "Revision History" appendix: Fixed embarrassing typos. 15) Various minor fixups on example scripts. Version 3.8 Blaeberry release, 02/26/06 1) In "Special Characters" chapter: Minor additions to leadin to "control characters" entries, and to "Ctl-K" and "Ctl-L" entries. 2) In "Introduction to Variables and Parameters" chapter: Rewrote lead-in. In "Variable Substitution" section: Added inline example of difference between variable name and value. Added escaped whitespace example to "ex9.sh" script. 3) In "Basic Commands" section of "External Commands" Chapter: At "cp" entry, added example of using -u option. 4) At beginning "Regular Expressions" chapter, added Stowe Boyd epigraph. 5) "System and Administrative Commands" chapter: In "Job Control" subsection, Added "pgrep/pkill" entry. At "ps" entry, mentioned "aux" options. In "Filesystem" subsection, At "lockfile" entry, more material, including usage example and footnote. Added "flock" entry. 6) In "File and Archiving Commands" section of "External Commands" Chapter: At "sha1sum" entry, added paragraph about security consultants' misgivings. More info at "cpio" entry. 7) In "Parameter Substitution" section of "Variables Revisited" chapter: Fixed minor typo at "${parameter:+alt_value}" example. (Thank you, Jemshad O K) 8) Partitioned "Security Issues Section" of the "Miscellany" chapter into two subsections. Added subsection about "shc" utility for compiling script source. 9) In "Loops" section of "Loops and Branches" chapter: Applied fixup to "bin-grep.sh" example. (Thank you, Anton Filippov.) 10) In "Redirecting Code Blocks" section of "I/O Redirection" chapter: Corrected annotation in final section of "redir2.sh" example. (Thank you, Brian Onn.) 11) In "Internal Commands and Builtins" chapter: Added "revposparams.sh" example. (Thank you, Dan Jacobson.) More info at "nmap" entry. 12) In "Text Processing" section of "External Commands" Chapter: At "egrep" / "fgrep" entry, added note about boolean "|" operator. 13) In "Here Strings" section of "Here Documents" chapter: Added short inline usage example. Added "mailbox_grep.sh" example. (Thank you, Francisco Lobo, for both of the above.) 14) Added "Bash Command-Line Options" section to (retitled) "Command Line Options" appendix. 15) In "Copyright" appendix: Added anti-DRM provisions. 16) Various minor fixups on example scripts. Version 3.7 Whortleberry release, 10/23/05 1) In "Special Characters" chapter: At "whitespace" entry, added footnote about newline/linefeed. 2) In "Basic Commands" section of "External Commands" Chapter: At "ln" entry, noted that only symbolic links can refer to a directory. 3) In "Text Processing Commands" section of "External Commands" Chapter: Modified comments in "wf.sh" example. At "grep" entry, fixed 2 typos "Now, let's search this file . . . " "printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz ." At "diff" entry, fixed typo ("spiff" --> "sdiff"). (Thank you, Frank Wang.) At "colrm" entry, changed "warning" to "caution" -- toned it down a bit. At "cut" entry, Added note about using linefeed as delimiter. (Thank you, Jaka Kranjc.) Got rid of unnecessary "cat" in inline example. At "iconv" entry, added snippet of code from "booklistgen.sh" script. (Thank you, Peter Knowles, for permission to use it.) 4) In "Complex Commands" section of "External Commands" Chapter: At "expr" entry, added usage example of escaped parentheses. (Thank you, Peter Knowles, for permission to use it.) 5) In "File and Archiving Commands" section of "External Commands" Chapter: Added "sha1sum" command at Frank Wang's suggestion. 6) In "Communications Commands" section of "External Commands" chapter: In "Remote Host Access" subsection, added "scp" entry. Added material at "uucp" entry. Added "uux" entry. At "wget" listing, added comments. At "rsync" entry, fixed up usage example. Added "fc4upd.sh" example. (Thank you, Frank Wang.) 7) In "Complex Commands" section of "External Commands" Chapter: At "xargs" entry, added footnote about speeding up execution. 8) In "Math Commands" section of "External Commands" chapter: Added Frank Wang's comments to "monthlypmt.sh" example. 9) In "Miscellaneous Commands" section of "External Commands" chapter: At "tee" entry, redesigned diagram for greater clarity. 10) In "Testing and Branching" section of "Loops and Branches" chapter: Rewrote explanation of filename "globbing" in the [list] of a for-loop and added comments to "list-glob.sh" example. 11) In "Quoting" chapter: Added sidebar near beginning of chapter. Removed intro paragraph (superfluous) at beginning of "Quoting Variables" section. 12) In "$RANDOM" section of "Variables Revisited" chapter: Added comment to "ex21.sh" example. 13) In "Command Substitution" chapter: Added footnote about nesting command substitution with backticks by using escaping. (Thanks, John Default.) 14) In "System and Administrative Commands" chapter: Moved "dmesg" entry to "Information and Statistics" subsection. In "Process Control and Booting" subsection, added "service" entry. At "uptime" entry, added note about load average. Fixups at "terminals and modes" sidebar, second example. (Thank you, Mark Norman.) 15) In "Bibliography" section: Added reference and URL for Col Needham's original IBDB scripts. 16) Numerous typos corrected, per a list sent in by Mark Norman (thanks!). 17) Various changes and fixups in example scripts. Version 3.6 Pokeberry release, 08/28/05 1) In "Special Characters" chapter: At "-" (redirection from/to stdin or stdout [dash]) entry, corrected comments. (Thank you, Frank Wang.) Replaced flawed first example at "brace expansion" entry. Added quoting comment at "whitespace" entry. 2) In "Operators" subsection of "Operations and Related Topics" chapter: Removed unnecessary "echo" from modulo operator usage example. (Thank you, Pasha Zubkov.) 3) In "/proc" section of "/dev and /proc" chapter: Added comment to "pid-identifier.sh" example, per Teemu Huovila. (Thanks!) 4) In "Testing and Branching" section of "Loops and Branches" chapter: Changed description of "case" construct from "equivalent of" to "analog to" "switch" in C/C++. (Thank you, Teemu Huovila.) 5) In "Communications Commands" section of "External Commands" chapter: Added "rsync" entry. 6) In "Miscellaneous Commands" section of "External Commands" chapter: Added additional usage example at "jot/seq" entry. 7) In "Internal Commands and Builtins" chapter: Added "testing 'false'" to "false" entry example. (Thank you, Joe Friedrichsen for the suggestion.) At "getopts" entry, made corrections in description of behavior of $GETOPTS. (Thank you, Pharis Monalo.) At "source" entry, added notes about passing arguments to "sourced" file and using a "return" to pass control back to the calling script. Added "caller" entry. 8) In "Contributed Scripts" appendix: Made changes to "whx.sh" script. 9) In "Test Constructs" section of "Tests" chapter: Fixed up "ex.11.sh" example for difference in Bash 3.x behavior. (Thank you, Frank Wang.) 10) In "Internal Variables" section of "Variables Revisited" chapter: Fixed up comments in "t-out.sh" example to reflect changes in Bash 3.x. (Thank you, Frank Wang.) Fixed up explanation of "anomalous" output given by ${PIPESTATUS[@]} in certain situations. (Thank you, Frank Wang, for providing Chet Ramey's explanation.) 11) In "Typing Variables" section of "Variables Revisited" chapter: Added caution + example of how "typeset" restricts the scope of a variable. (Thank you, Michael Iatrou.) 12) In "File and Archiving Commands" section of "External Commands" Chapter: At "file" entry, fixed typo (/usrlocal/bin => /usr/local/bin). Fixed error in "strip-comments.sh" example script. (Thank you, Jesse Gough.) 13) In "Complex Commands" section of "External Commands" Chapter: At "xargs" entry, added extra usage example. At "expr" entry, added example of illegal arithmetic operation. 14) In "$RANDOM" section of "Variables Revisited" chapter: Added Frank Wang's alternative to jipe's example. 15) In "Quoting" chapter: Split the chapter into introduction and "Quoting Variables" and "Escaping" sections. Corrected note about unquoted "grep" . . . Added discussion about quoting correcting echo's appetite for newlines. Clarified explanation of referencing quoted variables and added footnote. Amended tip about double quotes being necessary only to prevent word splitting. (Thank you, Harald Koenig.) 16) In "Local Variables" section of "Functions" chapter: In footnoted example of a segfaulting recursive function, added an "echo" to properly exercise the function. (Thank you, Dr. Roland Sonnenschein.) 17) In "Debugging" chapter: At listing of "Tools for debugging non-working scripts," added list item for "$LINENO" variable and "caller" builtin. At "trap" entry, replaced buggy "multiple-processes.sh" example. (Thank you, Tedman Eng.) 18) In "Copyright" appendix: Updated licensing terms to give the LDP the right to reassign custodianship of the book in the event the author cannot be contacted. 19) In "Bibliography" section: Added entry for Peter Knowles' booklistgen.sh -- Sony Librie booklist generator -- making possible Linux access to this neat e-book reader. 20) Corrected spelling of the name of contributor Stéphane Chazelas in multiple places. (Thank you, Bertrand Mollinier Toublet, for pointing out these embarrassing typos.) 21) Various changes and fixups in example scripts. Version 3.5 Boxberry release, 06/05/05 1) In "Indirect References to Variables" section of "Variables Revisited" chapter: Added "ugly kludge" sidebar. 2) In "Variable Assignment" section of "Introduction to Variables and Parameters" chapter: After "ex16.sh" example, noted that $(...) construct is a form of command substitution. 3) In "Special Variable Types" section of "Introduction to Variables and Parameters" chapter: In note about remedies for missing command-line parameters, added discussion about using parameter substitution, rather than adding extra characters to variable names. (Thank you, Fabian Kreutz.) 4) In "Command Substitution" chapter: At note at end of chapter, added mention that nesting is possible with $(...) construct, and added "agram2.sh" example script. 5) In "Internal Commands and Builtins" chapter: At "exec" entry, added footnote and streamlined text. 6) In "File and Archiving Commands" section of "External Commands" Chapter: At "more/less" entry, added "testing command sequence" usage example. At "mktemp" entry, added usage example and elaborated existing example. 7) In "Communications Commands" section of "External Commands" chapter: At "dig" entry, added "spam-lookup.sh" example. 8) In "Text Processing" section of "External Commands" Chapter: At "tail" entry, added usage example of combining "head" and "tail" to extract a specific line or lines from a text file. 9) In "System and Administrative Commands" chapter: At "umask" entry, added "rot13a.sh" example script. 10) In "Complex Functions and Function Complexities" section of "Functions" chapter: Added in-line example ("days in month") of capturing function "echo" as "return value." 11) In the "Shell Wrappers" section of "Miscellany" chapter: Added "pr-asc.sh" example script. 12) Changed "Files" chapter into an appendix. 13) In the "Sed and Awk Micro-primer" appendix: More examples of the awk "print" command. 14) In "Contributed Scripts" appendix: Added "whx.sh" script. (Thank you, Walter Dnes.) 15) Miscellaneous fixups and stylistic changes in the text and various scripts. Fixed up three misspellings of "permissible"! Updated morethan.org site address. Version 3.4 Teaberry release, 05/08/05 1) In "Special Characters" chapter: Some minor additions and cleanups. 2) In "Basic Commands" section of "External Commands" Chapter: At "ls" entry, minor fixups on "ex40.sh" example. At "rm" entry, added "rm -- -badname" method of deleting hyphen-prefixed filenames. 3) In "Time/Date Commands" section of "External Commands" chapter: At "date" entry: Added mention of "TZ=XXX" option. (Thanks, Frank Kannemann and Pete Sjöberg.) Also added discussion of additional options. 4) In "Communications Commands" section of "External Commands" chapter: At "lynx" entry, added paragraph on "-traversal" option. At "wget" entry, added comments to "quote-fetch.sh" example script. 5) In "Miscellaneous Commands" section of "External Commands" Chapter: At "sox" entry, added links for examples of script use. At "getopt" entry, fixed typo. 6) In "Math Commands" section of "External Commands" chapter: At "dc" entry, added echoing obfuscated text entry. 7) In "Internal Commands and Builtins" chapter: At "echo" entry, added comments to in-line examples of embedding linefeed in a string. (Per suggestion of Michal Jaegermann.) At "hash" entry, added footnote explaining what a hash is. Modified "col-totaler3.sh" example script to make it more interesting. At "forking" sidebar, added paragraph about parent-child process problem. 8) In "File test Operators" section of "Tests" chapter: Added deprecated "-a" option. 9) In "System and Administrative Commands" chapter: Added "nc" entry, and Added "iscan.sh" example script. (Thank you, Hobbit.) Added Dr. Andrew Tridgell's famous one-line script. (Thank you for permission to quote it, Tridge.) At "logrotate" entry, added URL for Stefano Falsetto's "rottlog" project. At "ps" entry, added graphical "tree" options. Added "quota" entry. Separated "Analyzing a System Script" into a section of its own. 10) In "Bash, version 3" section of "Bash, versions 2 and 3" chapter At "=~" entry, added Social Security number example. Added end of chapter note that version 3 update breaks a few old scripts. 11) In "Testing and Branching" section of "Loops and Branches" chapter: Added code snippet from Stefano Falsetto's "rottlog" package. (Thank you, Stefano.) 12) In "Debugging" chapter: Added Stefano Falsetto's "debecho ()" debugging echo. (Thank you, Stefano.) 13) In "$RANDOM" section of "Variables Revisited" chapter: Added footnote discussing "seeds." 14) In "Parameter Substitution" section of "Variables Revisited" chapter: Changed "rfe.sh" example to use "case" construct to test for command-line parameters. 15) In "Manipulating Strings" section of "Variables Revisited" chapter: Added "getopt-simple.sh" example. (Thank you, Chris Morgan.) 16) In "Gotchas" chapter: Added comments about 'exporting' inner shell variables to "subshell-pitfalls.sh" example. Added note that, as of Bash 3, periods are no longer permitted within variable or function names. 17) In "Here Documents" chapter: Added Huxley epigraph. Reshuffled order of first several examples. Added in-line example of an "ex script" (Smith/Jones replacement). 18) In "Regular Expressions" chapter: In "Globbing" Section: Stylistic fixups. Added footnote. 19) In "Assorted Tips" section of "Miscellany" chapter: Corrected "dialog.sh" example. Added entry on setting a variable to the contents of a sed or awk script, with cross-references to a couple of example scripts. 20) In "Contributed Scripts" appendix: Added Mariusz Gniazdowski's "Hash.lib" hashing library for scripting, and an example script using the library ("hash-example.sh"). (Thank you, Mariusz.) Minor revision of "mail-format.sh" example (converted sed script to a variable) 21) In "Writing Scripts" section of "Exercises" appendix: Added "Removing Inactive Accounts" exercise to "Intermediate" section. Added "Checking for Broken Links" exercise to "Intermediate" section. 22) In "Bibliography" section: Added Henry Spencer epigraph. Added "Wicked Cool Shell Scripts" entry. Added "seder's grabbag." Added Linuxreviews. 23) Miscellaneous stylistic changes in various scripts. 24) Many minor stylistic changes in the body of the text. Version 3.3 Raspberry release, 03/20/05 1) In the "Starting Off With a Sha-Bang" chapter: Amended footnote [3] to mention a cat / here document. (Thank you, Fabian Kreutz.) Fixed typo in "ex1a.sh" example. (Thank you, Preetam.) Added Larry Wall epigraph. Changed "Important" block to "Tip," and added "generalizing scripts" paragraph. 2) In "Special Characters" chapter: At "#" entry, noted that if comment follows a command on a line, then whitespace preceding the "#" is necessary. (Thanks, Le Wen.) 3) In "Basic Commands" section of "External Commands" Chapter: Greatly expanded discussion of "chattr" entry. 4) In "File and Archiving Commands" section of "External Commands" Chapter: Added "rpm -qf" tip at "rpm" entry. 5) In "Text Processing" section of "External Commands" Chapter: Added "enscript" entry. At "egrep" and "fgrep" entries. added symbolic link note added "dict-lookup.sh" example script. Updated "wc" entry. 6) In "Communications Commands" section of "External Commands" chapter: Added "netconfig" entry. 7) In "Math Commands" section of "External Commands" chapter: Fixup of "hexconvert.sh" example script (had left out initialization of E_NOARGS variable) (Thanks, Stefano Palmeri.) 8) In "Internal Commands and Builtins" chapter: At "forking/spawning" sidebar: Added "spawn.sh" example 9) In "Job Control Commands" section of "Internal Commands and Builtins" chapter: Corrected note discussing zombie processes. (Thank you, Alan Sundell.) 10) In "Here Documents" chapter: Removed reference to 'telnet' -- since it's generally not a good idea. 11) In "Of Zeroes and Nulls" chapter Added/revised discussion of /dev/zero. 12) In the "Shell Wrappers" section of "Miscellany" chapter: Added footnote giving examples of system utilities that are really shell wrappers. Added "logging-wrapper.sh" example. 13) In "Indirect References to Variables" section of "Variables Revisited" chapter: Expanded Nils Radtke's example of building dynamic variable names. 14) In "Parameter Substitution" section of "Variables Revisited" chapter: Fixed up "ex6.sh" example to make it less ambiguous, per suggestion of "Der Schwadde" . . . ). 15) In "Miscellaneous Commands" section of "External Commands" Chapter: At "dd" entry," added lowercase conversion in-line example. At "jot/seq" entry, added "letter-count.sh" example script. (Thanks, Stefano Palmeri.) 16) In "System and Administrative Commands" chapter: At "lockfile" entry, fixed typo in inline example. (Thanks, Andreas Abraham.) At "fuser" entry, added more material. 17) In "Gotchas" chapter: At "Mixing up '=' and '-eq' entry, fixed typo. (Thanks, Andreas Abraham.) 18) In "Colorizing Scripts" section of "Miscellany" chapter: Added "horserace.sh" example. (Thanks, Stefano Palmeri.) 19) In "Redirecting Code Blocks" section of "I/O Redirection" chapter: Added code snippet and commentary to redir2.sh example. (Thank you, Bruno de Oliveira Schneider.) 20) In "Copyright" appendix: Added second URL for French translation. 21) In the "Sed and Awk Micro-primer" appendix: Fixed "letter-count.sh" example to work with gawk, ver. 3.1.3. (Thanks to Stefano Palmeri for pointing out the need for a fixup.) Renamed filename to "letter-count2.sh" to accommodate alternate version of script which will appear prior to this one in the text. 22) In "Contributed Scripts" appendix: Fixups to "wgetter2.bash" script. Added "bashpodder.sh" script. (Thank you, Linc Fessenden.) 23) In "Writing Scripts" section of "Exercises" appendix: In "Intermediate sub-section": Added "Enforcing Disk Quotas" exercise. 24) Various miscellaneous fixups and enhancements: In example scripts. In citations of book titles (inserted tag). Version 3.2 Blueberry release, 02/06/05 1) In the "Starting Off With a Sha-Bang" chapter: Fixed small typo (if [ $# -ne $Number_of_expected args ]). Thanks, Robbie Morrison. Added epigraph to "Why Shell Programming?" section. 2) In "Special Characters" chapter: At "&" entry, added comment about Nasimuddin Ansari's suggested change to "background-loop.sh" example. 3) In "Colorizing Scripts" section of "Miscellany" chapter: Added link to Henry/teikedvl's utility for creating colorized scripts. 4) In "Complex Functions and Function Complexities" section of "Functions" chapter: Added "func-cmdlinearg.sh" example script to clear up confusion about command-line args passed to a script. 5) In "Local Variables" section of "Functions" chapter: Fixed typo in example in footnote. (Thank you, jaka kranjc.) 6) In "File and Archiving Commands" section of "External Commands" Chapter: At "files" entry, added example of finding specific file types in a given directory. 7) In "Communications Commands" section of "External Commands" chapter: At "ssh" entry, added caution about ssh using up loop's stdin. (Thanks, Jason Bechtel.) 8) In "Special Variable Types" section of "Introduction to Variables" chapter Some fixups for "ex18.sh" example. Added Chris Monson's example of finding last command line parameter. 9) In "Parameter Substitution" section of "Variables Revisited" chapter: Added material to "param-sub.sh" example. 10) In "Double Parentheses Construct" section of "Variables Revisited" chapter: In "c-vars.sh" example, added instances of differing side-effects of pre- and post-increment operators. (Thanks, Jeroen Domburg.) 11) In "Indirect References to Variables" section of "Variables Revisited" chapter: Added Nils Radtke's example of building dynamic variable names. 12) In "Text Processing" section of "External Commands" Chapter: Added extra explanatory lines at "grep" listing. Moved "manview.sh" script example from Contributed Script appendix to "groff, tbl, eqn" entry. 13) In the "Shell Wrappers" section of "Miscellany" chapter: Added redirection comment to "ex3.sh" example. (Thanks, jaka kranjc.) 14) In "Regular Expressions" chapter: Added listing of components of REs. Streamlined the discussion following. 15) In "$RANDOM" section of "Variables Revisited" chapter: Added footnote about randomness and pseudorandomness. Added a couple of cross-links in the text. 16) In "System and Administrative Commands" chapter: Added usage example at "last" entry. 17) In "/dev" section of "/dev and /proc" chapter: Changed reference URL from slashdot.org to net.cn (a known spam ISP). Added to footnote about mounting a USB flash drive. 18) In "Gotchas" chapter: Added note about not hyphenating function names. 19) In "Bibliography" section: Added William Parks' Dec. '04 "Linux Gazette" article to his listing. Added entry for "Unix Oneliners." Added "http://www.zazzybob.com" entry. 20) In "Writing Scripts" section of "Exercises" appendix: In "Intermediate" section, added "Integer or String" exercise . In "Intermediate" section, added "Logged in User Information" exercise . 21) In "Contributed Scripts" appendix: Added "cdll" expanded 'cd' command. (Thanks, Phil Braham.) Added "wgetter2.bash" example script. (Thanks, Little Monster .) 22) In "Localization" appendix: Again, fixed quoting problem in "localized.sh" in-line example (per Bruno Haible). 23) In "Important System Directories" appendix: Corrected "/sys" entry. Added "/mnt," "/dev," "/proc," and "/media" entries. 24) In "Analyzing Scripts" section of "Exercises" appendix: Added short example script. 25) Added comment block to sample .bashrc file (Appendix G). (Thanks, Ane-Pieter Wieringa.) 26) Deleted unwanted space in ": <>" entry. (Thanks, Mitchlan Landers.) 9) In "Time/Date Commands" section of "External Commands" chapter: At "date" discussion, added "ex58" cross-reference and using "date" to generate 6-digit random integers. 10) Bash, version 2.05b, no longer supports large negative integer return values. This required changing some text and rewriting the example scripts "max2.sh" and "return-test.sh" in the "Functions" chapter. Also, the "days-between.sh" script in the "Contributed Scripts" appendix needed modification. It serves me right for using undocumented features. 11) In "Functions" chapter: Added subsection on recursion in a function, without using local variables. Added Amit Singh's wonderfully recursive "Towers of Hanoi" (hanoi.bash) example script. 12) In "Gotchas" chapter: Added discussion of hazards of using undocumented features in Bash. 13) In "Internal Variables" section of "Variables Revisited" chapter: Revised discussion of "$TMOUT" variable to reflect changes in version 2.05b of Bash. Provided inline usage example. 14) In "Here Documents" chapter: Minor stylistic change in introductory paragraph. 15) In "Globbing" section of "Regular Expressions" chapter: Added discussion of changing globbing behavior using "set -f" and "nocaseglob" and "nullglob" options to 'shopt.' 16) In "Arrays" chapter: Fixed error in comment in "array-ops.sh" example. (Paulo Marcel Coelho Aragao and Emilio Conti both pointed this out.) Fixed error in comment in "array-strops.sh" example. (Thanks, Paulo Marcel Coelho Aragao.) Fixed misleading comment in "ex67.sh" example, and added comment about use of "@" and "*" in array notation being analogous to $@ and $*. (Thanks, Paulo Marcel Coelho Aragao.) Removed unnecessary instances of "declare" from "empty-array.sh" example. (Thanks, Paulo Marcel Coelho Aragao.) Simplified in-line example demonstrating loading of the contents of a file into an array. (Thanks, Paulo Marcel Coelho Aragao.) Added comments suggesting a simplification in "bubble.sh" example. (Thanks, Paulo Marcel Coelho Aragao.) 17) In "Contributed Scripts" appendix: Added Konstantin Riabitsev's "usb.sh" example. Fortunately, the script is GPL, which is compatible with the ABS Guide license. 18) In "Analyzing Scripts" section of "Exercises" appendix: Minor stylistic changes in commentary. 19) In "Copyright" appendix: Added links for Russian and Italian translations. 20) Moved the Revision History to the back of the book, into an appendix of its own. (I have had numerous requests to do this.) Version 2.2 'CRANBERRY' release, 11/01/03 Comments: Major release. Much new material added. 1) In "Text Processing Commands" of "External Commands and Filters" chapter: Fixed up listing of "gettext." (Thanks, Bruno Haible.) Added "msgfmt." Renamed "du.sh" example to "Du.sh" to avoid confusion with system 'du" command. (Thank you, Bill Gradwohl.) 2) In "Typing Variables" section of "Variables Revisited" chapter: At 'declare,' added example of arithmetic operations enabled with '-i' option. Fixed term heading to "-x var=$value." (Thank you, Bill Gradwohl.) 3) Modified "Localization" appendix, per suggestions by Bruno Haible. 4) In "Internal Variables" section of "Variables Revisited" chapter: Added '$PROMPT_COMMAND.' Fixed an error in "arglist.sh" example. Added Bjön Eriksson's "readpipe.sh" example. 5) In "Local Variables" section of "Functions" chapter: Modified note in example script in footnote 2. (Thanks, Zhao You Bing.) 6) Fixed up references to my own "yawl" package, to reflect the latest update. 7) In "Writing Scripts" section of "Exercises" appendix: In "Difficult" section, added "Testing Passwords" exercise . 8) In "Subshells" chapter: In in-line script example that tests whether variable is set, noted that this also tests whether that variable is present in the environment (exported). (Thank you, Mr. Fred.) 9) In "Comparison Operators" section of "Tests" chapter: Corrected typos in "str-test.sh" example. (Thank you, Bill Gradwohl.) 10) In "Internal Commands" chapter: Fixed a typo in "ex46.sh" example. (Thank you, Bill Gradwohl.) Fixed a typo in "ex33.sh" example, and implemented changes to explain what OPTIND does. (Thank you, Bill Gradwohl.) 11) In "Information and Statistics" subsection of "System and Administrative Commands" chapter: Substituted better example of 'sar' output. (Thank you, Sebastien Godard.) 12) In "Local Variables " section of "Functions" chapter: Fixed up "ex62.sh" example. (Thank you, Bill Gradwohl.) 13) In "Basic Commands" section of "External Commands" Chapter: Added to discussion of 'ln.' Fixed typo in in-line example listing at 'cat,tac.' (Thank you, Bill Gradwohl.) 14) In "Miscellaneous Commands" section of "External Commands" Chapter: Corrected "ex33a.sh" example. Noted that 'getopt' permits long options. (Thank you, Eric Levy.) 15) In "RANDOM" section of "Variables Revisited" chapter: Noted exception in "Jipe" method of generating random numbers within a given range. Added improved formula for generating randoms within a range. (Thank you, Bill Gradwohl.) Added "random-between.sh" example for generating randoms within a range. (Thank you, Bill Gradwohl.) 16) In "Arrays" chapter: Changed in-line example of miscellaneous array operations to an external shell script and enhanced it, per suggestions by Michael Zick. Added "array-strops.sh" example of using string manipulation operations on arrays. Added "array-assign.bash" script. Added "array-append.bash" script. (Thank you, Michael Zick.) 17) In "Special Characters" chapter: At "Control Characters," section, added Ctl-B, Ctl-I, Ctl-S, and Ctl-K listings. Fixed listing for Ctl-M (Thanks, Lee Maschmeyer.) Also added Lee Maschmeyer's in-line example. 18) In "Gotchas" chapter: At "Piping echo output . . . " inserted missing space. 19) In "Exit and Exit Status" chapter: Added material to discussion of "bare" exit. 20) Added "Where to Go For Help" section to "Endnotes" chapter. 21) In the "Sed and Awk Micro-primer" appendix: Added "nyal's" "letter-count.sh" script. 22) In "Contributed Scripts" appendix: Added Michael Zick's "protect_literal.sh" script. Added Michael Zick's "unprotect_literal.sh" script. Added Michael Zick's "basics-reviewed.bash" script. 23) In "Bibliography" section: Added 'Bash Navigator' listing. Added 'GNU Bash Reference Manual' listing (thanks, Brian Gough). 24) Miscellaneous cleanups on example scripts. Version 2.1 'HUCKLEBERRY' release, 09/14/03 1) In Appendix B, "Reference Cards: Fixups -- (thanks to errors brought to my attention by Heiner Steven). 2) In Appendix B, "Reference Cards: Added "Miscellaneous Construct" table. Added variable prefix matching to "Parameter Substitution" table. 3) In "Internal Variables" section of "Variables Revisited" chapter: Noted that "$*" must be quoted to differentiate it from "$@" variable, and added a case to "arglist.sh" example to demonstrate this. (Thanks, Heiner Steven.) 4) In "Command Substitution" chapter: Added note about the invocation of a subshell. Likewise added note in "setting variable to a file" in-line example. (Thanks, Paul Heffner.) Removed erroneous comment from in-line example of setting a variable to contents of a file. (Thanks, Anthony Richardson.) 5) In "Arrays" chapter: Added "script-array.sh" example. (Thanks, Chris Martin, for the inspiration.) 6) In "System Resources" subsection of "System and Administrative Commands": Fixed minor error ("while 1") in 'ulimit' illustrative script. (Thanks Emmanuel Chantreau) 7) In "Subshells" chapter: Added a paragraph of commentary concerning external commands and Bash builtins. 8) In "Special Characters" chapter: Elaborated example of ';' usage. 9) In "Gotchas" chapter: Added in-line example of problem caused by piping to a loop. (Thanks Anthony Richardson.) 10) In "System and Administrative Commands" chapter: Added more info to "sar" listing. 11) In "Writing Scripts" section of "Exercises" appendix: Added "Monitoring Processes" exercise. 12) In "Recursion" section of "Miscellany" chapter: Added Anthony Richardson's "usrmnt.sh" example. (Thanks!) 13) Slight modifications to certain example files for clarification. Version 2.0 'GOOSEBERRY' release, 08/24/03 Comments: In view of the cumulative changes in the last several updates, it's bumped up to a major version. This is now officially a "mature" project. 1) In "Manipulating Strings" section of "Variables Revisited" chapter: Added negative index substring extraction example (Thanks, Dan Jacobson). 2) In "Sed appendix": Changed title of second table, to make it less ambiguous. 3) Changed "Sunsite" address in two examples. 4) Made capitalization of example scripts more consistent. 5) In "Command Substitution" chapter: Fixed typo in backquotes discussion (Thanks, Jiri Beran). 6) In "Process Substitution" chapter: Added clarifying comment to SuSE script fragment (Thanks Ulrich Gayer). 7) In "Invoking the script" section of "Starting Off With a Sha-Bang" chapter: Corrected typo in discussion (" . . . not recommended is using sh "foo"). (Thanks, Norman Megill.) Noted that 'echo "\" invokes secondary prompt. 9) In "Here Document" chapter: Shuffled the order of a couple of examples. Added warning about closing 'limit string' starting in first character position on its line, with in-line example. (Also added a mention in "Gotchas" chapter. Added "script-generate.sh" example of generating program code by disabling parameter substitution within the body of a 'here document.' (Thanks, Albert Reiner, for the idea.) 10) In "Miscellaneous" subsection of "System and Administrative Commands": chapter: Added listing for "dialog" toolsets. 11) In "Assorted Tips" section of "Miscellany" chapter: Added discussion of "dialog" toolsets, with "dialog.sh" example. 12) In "Copyright" appendix: Updated notices. 13) Added "Reference Cards" appendix. Thank you, Aurelio Marinho Jargas, for giving me the inspiration. 14) In "Bibliography" section: Added LINUX JOURNAL article, "Scripting for X Productivity" listing. Added Jargas' entry for "Regular Expression wizard." 15) In "Loop Control" section of "Loops and Branches" chapter: Embellished "symlinks.sh" example with Jean Helou's alternative method. 16) Typo fixes supplied by Edward Scholtz (thanks!): "Special Variable Types" section of "Introduction to Variables" chapter "fairly simply way" --> "fairly simple way" "Quoting" chapter "advisable in enclose it" --> "advisable to enclose it" 17) In "Copyright" appendix: Added note about contributors rights. Added mention of Russian translation being underway. 18) Corrected several minor typos in the text and script examples. Version 1.9 [Cleanups & revisions] 'PERSIMMON' release, 06/21/03 1) In "Portabilities Issues" section of "Miscellany" chapter: Added URL for article about Caldera's release of UNIX source. [Yes, indeed, before Caldera reinvented itself as SCO, it had begun to Open Source the code to UNIX.] 2) In "Copyright" appendix: Added trademark notices. 3) In "Arrays" chapter: Added another initialization option to in-line example. Fixed error in comment in "q-function.sh" example. Added "embedded-arrays.sh" example of using indirect references with embedded arrays. (Thank you, Dennis Leeuw.) 4) In "Regular Expressions" chapter: Added mention of "anchors." 5) In "Assorted Tips" section of "Miscellany" chapter: Added in-line example of using "if-test" constructs to comment out code blocks. 6) In "cannon.sh" example: Added comment about firing cannon balls only at the upper right-hand corner. (Thanks, Emilio Conti, for making me think about this.) 7) In "String Manipulation" section "Variables Revisited" chapter: Fixed two errors in comments of in-line substring replacement example. (Thanks, Emilio Conti.) 8) In "ex21.sh" example: Eliminated unnecessary variable. (Thanks, Emilio Conti.) 9) In "wstrings.sh" example: Eliminated unnecessary variable. (Thanks, Emilio Conti.) 10) In "Comparison Operations" section of "Tests" chapter: Fixed if ["$a" -gt "$b" ] Missing space! (Thanks, Thomas Treutner.) 11) In "Communications Commands" section of "External Commands" chapter: Moved "cu" to after "uucp," since it's part of the latter's command set. 12) In "Contributed Scripts" appendix: Corrected error in comment in "makedict.sh" script. 13) In "Copyright" appendix: Updates. 14) Various minor script updates. Version 1.8 [Cleanups & revisions] 'BREADFRUIT' release, 05/10/03 1) Revised "self-document.sh" to remove unnecessary 'cat.' 2) In "cvt.sh" example, quoted target file name and added exercise. 3) Updated Jordi Sanfeliu's e-mail address in "Credits" chapter and in "tree.sh" example script. 4) In "blot-out.sh" script, updated the Peter Gutmann URL. 5) In "Miscellaneous" subsection of "System and Administrative Commands" chapter: Added "watch" command. 6) In the introduction, in reason not to use shell scripts, Removed misleading reference to Open Source (thank you, Peter Lietz, for pointing this out). 7) In "Quoting" chapter: Added footnote about problem double quoting "!" and "\!". (Thanks, Wayne Pollock.) 8) In "Internal Commands" chapter: Added caution about 'cd //' problem. (Thanks, Wayne Pollock.) Added short example of "$!" usage. (Thanks, Jacques Lederer.) 9) In "Arrays" chapter: Replaced "empty-array.sh" with an extended version. Added note that Bash treats variables as arrays, even if not declared as such. Added example of nested arrays. Added example of copying and concatenating arrays. (All the above thanks to Michael Zick.) 10) In "Tests" chapter: Fixed up "Tests Constructs" section link (finally!). 11) In "Command Substitution" chapter: Added mention of $(<$file) construct. 12) In "Functions" chapter: Added material to nested functions in-line examples. 13) In the "Portability Issues" section of the "Miscellany" chapter: Added short list of Bash-specific features. 14) In "File and Archiving Commands" section of "External Commands" Chapter: Added "dos2unix" utility. 15) In "Gotchas" chapter: Added short in-line example of using an uninitialized variable. Added in-line example showing DOS-formatted script failing to run. 16) In "Contributed Scripts" appendix: Added Michael Zick's "directory-info.sh" script. 17) In "Bibliography" section: Updated "The UNIX CD Bookshelf" reference. Added Eric Pement's sed resources page. Removed outdated "Sed F.A.Q." reference. Updated Frisch entry. Updated Shelldorado and Giles Orr entries. 18) Updated sample .bashrc file (Appendix G). 19) A few minor error corrections and clean ups at various places in the text. Version 1.7 (minor update) 'COCONUT' release 01/05/03 1) In "Special Variable Types" section of "Introduction to Variables and Parameters" chapter: Added note about "$*" and "$@" special variables, and updated "ex17.sh" example to reflect this. 2) In "Manipulating Strings" subsection of "Variables Revisited" chapter: Added "paragraph-space.sh" example. 3) In "Loop Control" section of "Loops and Branches" chapter: Added "continue-n.example" to illustrate use of "continue N" construct. (Thank you, Albert Reiner.) 4) In "Internal Commands" chapter: Added section to "read-redir.sh" example to show setting "$IFS" within a loop. (Thanks, Dim Segebart.) Added Rory Winston's example of "eval" usage. 5) In "List Constructs" chapter: Deleted erroneous comment in "ex65.sh." (Thank you, Francisco de Jesus Orozco Ruiz.) 6) In "File Test" section of "Tests" chapter: Added "broken-link.sh" example. 7) In "Internal Variables" section of "Variables Revisited" chapter: Added comment on $PIPESTATUS. 8) In "RANDOM" section of "Variables Revisited" chapter: Added the 'jipe' techniques for generating random numbers within a specified range. Added "pick-card.sh" example. Thank you once more, jipe. 9) In "Miscellaneous Commands" section of "External Commands" Chapter: Amended discussion of "tee" command. 10) In "System and Administrative Commands" chapter: Expanded "ulimit" discussion to include "fork bomb" scenario. 11) In "Aliases" chapter: Slightly revised "alias.sh" example. 12) Various minor fixups on example scripts. Version 1.6 (minor update) 'POMEGRANATE' release 09/29/02 1) In "System and Administrative Commands" chapter: Added "nmap" entry, with in-line usage example. 2) In "Communications Commands" section of "External Commands" chapter: Revised "self-mailer.sh" example. 3) In "Miscellaneous Commands" section of "External Commands" Chapter: Added "objdump" entry, with usage example. 4) In "File and Archiving Commands" section of "External Commands" Chapter: Added "readlink" entry. 5) In "/dev and /proc" chapter: Added example of extracting information from a /proc file. 6) Moved Chapter 3, "Exit and Exit Status" ahead 3 positions, to make it Chapter 6. This makes the organization of the first part of book more logical. 7) In "List Constructs" chapter: Added discussion of using an "and list" to supply a default command-line argument. 8) In "Quoting" chapter: Rewrote "Of course, grep [Ff]irst *.txt would not work." This does work under Bash, and fails under tcsh. (Thanks, Simon Williams.) Added example of hexadecimal character assignment to "escaped.sh" example. (Thanks, Greg Keraunen.) 9) In "Special Variable Types" section of "Introduction to Variables and Parameters" chapter: Showed how to reference the last command-line parameter. 10) In "Internal Commands" chapter: Added cautionary note about setting and exporting a variable in a single operation (thanks, Greg Keraunen). Added use of '-n' option to "read" to detect keypress of arrow keys, with "arrow-detect.sh" example. (thanks, Sandro Magi). 11) In "Assorted Tips" section of "Miscellany" chapter: Added example of using "whatis" to test for an invoked command and do a workaround if necessary. 12) In "Colorizing Scripts" section of "Miscellany" chapter: Fixed typo in comment in "color-echo.sh" example. 13) In "Debugging" chapter: Added note about syntax error messages possibly ignoring comment lines when calculating the line number of the error. (Thanks, Keith Matthews) 14) Wrote a short introduction to "Part 4: Advanced Topics." 15) In "Writing Scripts" section of "Exercises" appendix: In "Intermediate" section", added "Mailing List" exercise. 16) In the "Sed and Awk Micro-primer" appendix: Added discussion and example of single-quoted 'sed' editing command not working. 17) In "Bibliography" section: Updated entry for "Sed F.A.Q." / "Do It With Sed." 18) Various minor fixups on example scripts. Version 1.5 (major update) 'PAPAYA' release 07/13/02 1) In "Basic Commands" section of "External Commands and Filters" Added "man, info" entry. At "ls," added comments to "ex40.sh" example. 2) In "File and Archiving Commands" section of "External Commands and Filters" section: Moved "shred" to "Utilities" subsection and did minor rewriting of entry. Fixed minor error in "de-rpm.sh" example. Added "mktemp" entry. Added "rpm" entry, with usage examples. Added "rpm2cpio" entry. 3) In "Math Commands" section of "External Commands" chapter: Split "bc" and "dc" into separate entries. At "bc", added "cannon.sh" example. 4) In "Miscellaneous Commands" section of "External Commands" Chapter: At "mcookie" entry, added "tempfile-name.sh" example. At "seq" entry, added section to "ex53.sh" example. Added "units" entry, with "unit-conversion.sh" example. Added "doexec" entry. More info at "pathchk" entry. 5) In "Communications Commands" section of "External Commands" chapter: Added usage example at "host" entry. Revised "finger" entry. Added "ipcalc" entry. Added "mailto" entry. Added "wget" entry. Added "lynx" (with "-dump" option) entry. More info at "nslookup." More info at "dig." More info at "traceroute." 6) In "Time/Date Commands" section of "External Commands" chapter: More info at "usleep" entry. 7) In "Terminal Control Commands" section of "External Commands" chapter: Added more options at "tput" entry. Added "infocmp" entry, with usage example. 8) In "File and Archive Commands" section of "External Commands" Chapter: Added info at "diff" entry. 9) In "Complex Commands" section of "External Commands" Chapter: At "find" entry, clarified introductory remarks, and added info. 10) In "Internal Commands and Builtins" chapter: At "source" entry, added "self-source.sh" example. At "shopt" entry, fixed up usage example. 11) In "Job Control Commands" section of "Internal Commands": Added comments to "self-destruct.sh" example. 12) In "Testing and Branching" subsection of "Loops and Branches" chapter, Improved "isalpha.sh" example (added integer test function). 13) In "System and Administrative Commands" chapter: Added "passwd" entry, with in-line illustrative script. Added "readelf" entry. Added "size" entry. More discussion in "Modules" subsection. Added usage example at "dmesg" entry. 14) In "Assorted Tips" section of "Miscellany" chapter: Added "Colorizing Scripts" section, with "ex30a.sh" and "color-echo.sh" examples. Added "agram.sh" example of iterated piping to a filter. 15) In "Optimizations" section of "Miscellany" chapter: Added "avoiding unnecessary commands." 16) In "Arrays" chapter: Added "poem.sh" example. 17) In "Regular Expressions" chapter: Clarifications and error corrections on "Extended Regular Expressions" section (thanks, Peter Tillier). 18) In "Tests" chapter: Added code to "arith-tests.sh" example. 19) In "Parameter Substitution" chapter: At "${parameter-default}", added usage when command-line parameters in a script are "missing." At "${paramter?err_msg}", added "usage-msg.sh" example. 20) In "Functions" chapter: Added info to "ex60.sh" example. 21) In "Gotchas" chapter: Added material to "badread.sh" example. 22) In "Special Characters" chapter: Added usage examples at "*" entry. 23) In "Variable Substitution" section of "Introduction to Variables" chapter: Added in-line example of using uninitialized variable in arithmetic operations. 24) In "Bash Variables are Untyped" section of "Introduction to Variables" chapter: Rewrote "int-or-string.sh" example. 25) Renamed "Oddities" section of "Miscellany" chapter to "Recursion", and moved it forward. 26) In "Starting off with a Sha-Bang" chapter: Added commentary and script snippet to footnote [2]. 27) Slight revision to introduction to the book. 28) In "Contributed Scripts" appendix: Added "soundex.sh" example. Fixed minor typo in lead-in to "obj-oriented.sh" example. 29) In "Writing Scripts" section of "Exercises" appendix: Added "Justification" exercise to "Intermediate" section. Added "Buffon's Needle" exercise to "Difficult" section. Added "Chasing Spammers" exercise to "Difficult" section. 30) In "Bibliography" section: Added Steve Parker entry. 31) Added Landon Noll epigraph to end of "Scripting With Style" chapter. 32) Various minor cleanups and additions to example scripts. Version 1.4 (minor update) 'MANGO' release 06/16/02 1) In "Special Characters" chapter: Added "<" and ">" ASCII comparison entry. Added "\<" and "\>" word boundary in a regular expression entry. Added "&>" to redirection characters. Added "history mechanism" comment to "!" entry. 2) In "Debugging" chapter: Added "missing-keyword.sh" example of error message, with note. Minor language clarification. 3) In "Tests" chapter: Added material to "ex11.sh" example. Changed "cmp a b >/dev/null" inline example to "cmp a b &>/dev/null (thanks Baris Cicek). 4) In "I/O" Redirection chapter: Added "&>filename" to redirection chart. 5) In "Of Zeros and Nulls" chapter: Added comment to "suppressing output" inline example. 6) In "External Commands and Filters" chapter: Moved "diff", "patch", "diff3", "sdiff", "cmp", and "comm" from "Text Processing Commands" section to "File and Archiving Commands" section, and created a "Comparison" subsection for them. Moved "ptx" from "Text Processing Commands" section to "File and Archiving Commands" section. Gave the sections descriptive subtitles. 7) In "Text Processing Commands" of "External Commands and Filters" chapter: Added tests to "file-comparison.sh" example. At "head", added "script-detector.sh" example. 8) In "Miscellaneous Commands" section of "External Commands" Chapter: Added "mcookie" entry. 9) In "Math Commands" section of "External Commands" chapter: At "bc/dc" entry, added "hexconvert.sh" and "factr.sh" (thanks, Michel Charpentier) examples of using "dc." 10) In "List Constructs" chapter: Minor rewriting of "ex65.sh" example. 11) In "Contributed Scripts" appendix: Added "blank-rename.sh" example. 12) In "Writing Scripts" section of "Exercises" appendix: Added detail to "Safe Delete" exercise and moved it to "Intermediate" subsection. Added "Automatically Decompressing Files" exercise ("Easy" section). Added "Lottery Numbers" exercise ("Easy" section). Added "Passwords" exercise ("Intermediate" section). Added "Fog Index" exercise ("Difficult" section). 13) In the "Security Issues Section" of the "Miscellany" chapter: Added 'Unix Scripting Malware' reference to the footnote. 14) In "Starting off with a Sha-Bang" chapter, Fixed typo in comment in "ex2.sh" example ('wtemp' --> 'wtmp') Thanks for pointing this out, Julien Reveret. 15) In "Internal Commands and Builtins" chapter: At "read" entry, added in-line example of using "cat" to pipe to a "read". 16) In "Optimizations" section of "Miscellany" chapter: Added text. 17) Numerous typos corrected from a list sent in by Andreas Abraham (thanks!). [Imagine that, I've been misspelling "Eratosthenes" since the 8th grade.] Version 1.3 'TANGERINE' release 06/02/02 1) In "Arrays" chapter: Revised the "bubble.sh" example script by splitting the array variable. 2) In "Here Documents" chapter: Clarified introduction. Added using a here document to comment out a block of code (thanks, Adam Lazur for pointing this out), with "commentblock.sh" example. Added a "self-documenting" script example ("self-document.sh"). Added using a here document to supply input to a function, with "here-function" illustrative example. 3) In "Contributed Scripts" appendix: Modified "life.sh" example to accept different startup file as a parameter at invocation. Added "makedict.sh" example. 4) In "Exercises" appendix: Added "sum matching numbers" exercise. 5) In "Oddities" section of "Miscellany" chapter: Added Rick Boivie's "pb.sh" script as a recursive script example. 6) In "Optimizations" section of "Miscellany" chapter: Editing of "loops" paragraph. Added cross-reference to "monthlypmt.sh" script. 7) In "Parameter Substitution" chapter: Fixed typos at "${var/#patt/replacement}" and "${var/#patt/replacement}" discussion (thank you, Dr. Claudia Neumann, for pointing this out). 8) In "Sed and Awk Mini-Primer" Added sed script cross-reference. 9) In "Basic Commands" section of "External Commands" Chapter: More info at "mv". 10) In "File and Archive Commands" section of "External Commands" Chapter: More info at "md5sum". Added "file-integrity.sh" example at "md5sum". At "tar", added various options and clarified commentary. More info at "bzip2". Added "unarc/unarj/unrar" entry. 11) In "Text Processing Commands" section of "External Commands" Chapter: Added footnote at "tr" explaining that only the GNU version recognizes character classes. 12) In "Complex Commands" section of "External Commands" Chapter: Added notes to example "ex45a.sh". Fixups in "ex45.sh" and "ex45a.sh". Corrected commentary on escaped parentheses grouping operator. 13) In "Time/Date Commands" section of "External Commands" chapter: Added ">> newfile" at "touch". 14) In "Math Commands" section of "External Commands" chapter: Added Rick Boivie's comments and improvements (2 sets) to "monthlypmt.sh" example script. 15) In "Miscellaneous Commands" section of "External Commands" chapter: Added "getopt", with "ex33a.sh" illustrative example. 16) In "Special Characters" chapter: Clarification and added material at "-" (hyphen), including option flag. Added mention of use as option flag at "+". Added short definition of a "filter." At ".", reorganized entry and added current working directory and parent directory (..). At "?", reorganized entry and added "test operator" meaning. At "$", added "end-of-line" regular expression meaning. At "[]", added array element and regular expression meanings. Added "$?" entry. Added "$$" entry. Added "^" entry. Added "||" entry. Added "&&" entry. 17) In "Internal Commands and Builtins" chapter: Partially rewrote and clarified the introduction to the chapter. Added brief discussion of what happens when 'read' lacks. an associated variable, with "read-novar.sh" example. At "set", added discussion of "--" option, with "set-pos.sh" example and added discussion of "set" with no options and arguments. At "exec", added "self-exec.sh" example. 18) In "Job Control Commands" section of "Internal Commands and Builtins" chapter: Added "self-destruct.sh" example at "kill." 19) In "Of Zeros and Nulls" chapter, added examples of using /dev/null. 20) In "Debugging" chapter, fixed up "online.sh" example to cope with changed requirements of newer Linux kernels. 21) In "Aliases" chapter, added comment to "alias.sh" example, per a suggestion by Steve Jacobson. 22) In "Gotchas" chapter: Added piping to a "read", with "badread.sh" example. Added note about GNU utilities in scripts. 23) In "I/O Redirection" chapter: Clarified language in chart. Added '>' as zero-length file truncation operator. Added "reassign-stdout.sh" and "upperconv.sh" examples at "exec". 24) In "String Manipulation" section of "Variables Revisited" chapter: Added instances in in-line examples. Added end-of-string operators for 'expr'. Small fixup in "underscore variable" inline example. 25) In "Regular Expressions" chapter: Added '\<...\>' word boundary markers. 26) In "Quoting" chapter: Fixed minor syntax error in "tar" example (thanks, Ian Barwick). 27) Expanded "Author's Note" section of "Endnotes" chapter. 28) Fixed minor typo in table in "Exit Codes With Special Meanings" appendix. 29) Added reference links to "environmental variables" explanation. 30) Fixed reference links to "startup files" section. 31) In "Miscellany" Chapter: Added "Security Issues" section. 32) In "Bibliography" section: Added Denning entry. Added Polya entry. Added "Shell Corner" entry. Added "UNIX Grymoire" entry. 33) In "Copyright" appendix: Clarified license terms with reference to "Open Publication License." 34) Various minor fixups and enhancements to example scripts. 35) Updated references to LDP site (changed from 'linuxdoc.org' to 'tldp.org'). Version 1.2 (major release) 03/31/02 1) In "Operators" subsection of "Operations and Related Topics" chapter: Fixed comment in in-line example (thanks, Marcus Bergöf). Added "gcd.sh" example at "%" (modulo) operator. 2) In "Numerical Constants" subsection of "Operations and Related Topics" chapter: Fixed up and enhanced "numbers.sh" example (thanks, Rich Bartell). 3) In "arithops.sh" example, fixed comment to refer to correct operation (thanks, Marcus Bergöf). 4) In "Command Substitution" chapter: Added excerpts from /etc/rc.d/rc.sysinit as examples of setting a variable to the contents of a file using "var=`cat filename` construction. Added "csubloop.sh" example of setting a variable from the output of a loop. 5) In "Basic Commands" section of "External Commands and Filters" chapter: Added info on "-f" option at "mv" and "rm". Added "-s" option at "cat". 6) In "Text Processing Commands" sect. of "External Commands and Filters" chapt.: Added more info for "nl". Rewrote "groff" as a separate entry, and added "col" and "tbl"/"eqn" as subentries. Added much more info on "tr". Added more options to "grep". 7) In "Complex Commands" section of "External Commands" chapter: Added more info at "xargs". Added caution when using "*" with "expr" in arithmetic operation. 8) In "Miscellaneous Commands" section of "External Commands" chapter: Added more info on "jot/seq". Added "Linux Journal" reference at "m4". 9) In "File and Archiving Commands" section of "External Commands and Filters" chapter: Added "mimencode/mmencode". More info on "cksum"/"md5sum". Added "wstrings.sh" example at "strings" entry. 10) In "Communications Commands" section of "External Commands" chapter: Added "mail", with "self-mailer.sh" illustrative example. 11) In "Time/Date Commands" section of "External Commands" chapter: Added discussion of "-u" option to "date". 12) In "Special Variable Types" section of "Introduction to Variables" chapter: Improved link to "bracket" notation. Added note that "shift" command also applies to function parameters. 13) In "Internal Variables" section of "Variables Revisited" chapter: Added info on "$@" special variable, with new in-line example. Corrected "$DIRSTACK" listing (thanks again, Nick Drage). At "$TMOUT", added "t-out.sh", another example of timed input (thanks, syngin seven). Added commentary to "am-i-root.sh" example. 14) Changed document subtitle. 15) In "Command Substitution" chapter: Corrected word-splitting example in "caution" (thanks, Tony Richardson). Added "stupid-script-tricks.sh" example of setting a variable to the contents of a binary file (which has no useful applications). 16) In "Internal Commands and Builtins" chapter: Clarified "ex43.sh" example (thanks, Tony Richardson). Clarified explanation and example of "echo" eating linefeeds in a command fed to it. More info on "keywords" topic. 17) In "Special Characters" chapter: Added in-line example of embedding Ctl-H's in a variable. More info on '-' as an option to certain commands. Added "background-loop.sh" example at "&" (run command in background). 18) In "Bash, version 2" chapter: Added "resistor-inventory.sh" example of database using indirect variable referencing. 19) Changed name of example "rot13_2.sh" to "rot14.sh" because otherwise SGML conversion seems to experience namespace confusion. 20) In "Quoting" chapter: Added header notes to "\" escape usage listing. Added in-line example on behavior of "\". Slight revisions to "escaped.sh" example. 21) In "Internal Variables" section of "Variables Revisited" Chapter: Added usage example for "$GROUPS". 22) In "Gotchas" chapter: Added mixing up integer and string comparison operators. 23) In "While Loops" subsection of "Loops and Branches" chapter: Added clarifying statement as to when "while loops" are used. Added "userlist.sh" example of command substitution in generating "[list]" in "for loop". 24) In "System and Administrative Commands" chapter: Added "rmmod". added "sudo". Added commentary on "debugfs". 25) In "Exercises" Appendix: Reorganization into two distinct subsections. Added a sample script to annotate. Added a script code snippet to fix up. Added a few more script writing problems, including the very difficult "Playfair Cipher". 26) Simplified "wf.sh" example. 27) In "Starting off with a Sha-Bang" chapter: Fixed typo in "ex2.sh" example script (thanks, David Kimbro for bringing this to my attention). 28) In "Arrays" chapter: Rewrote confusing language in introductory paragraph. Added "stackex.sh" example for emulating data structures. Added in-line example of loading an array with the contents of a text file. 29) In "Tests" chapter: Clarification of why semicolon needed when "if" and "then" are on same line. Added material to "ex10.sh" example. 30) In "Here Documents" chapter: Modified "ex69.sh" example, per message from Jess Thrysoee relaying to me clarification from Bram Moolenaar. 31) In "I/O Redirection" chapter: Fixed comment on in-line example on closing file descriptors. (Thanks, Matthieu Lucotte) Made the data file for redirection examples, "names.data", visible. 32) In "Assorted Tips" section of "Miscellany" chapter: Added repeated piping of the output of a filter back to that same filter. Added alternative method of having a function return a value to the body of the script, with "multiplication.sh" example showing how. Added method of having a function "return" multiple values, with illustrative "sum-product.sh" example. Added "tolower()" function to function library. Added methods of passing an array to a function, and returning an array from a function to the main body of a script (with example "array-function.sh"). 33) In "Contributed Scripts" appendix: Added "collatz.sh" example. Added "life.sh" example (Conway's "Game of Lif