CHANGE LOG & Release History The latest version of this file is available on-line at http://http://bash.webofcrafts.net/Change.log ================================================================== Current version = 6.4.05 Dated 09/27/11 http://bash.webofcrafts.net/abs-guide-latest.tar.bz2 http://bash.webofcrafts.net/abs-guide.pdf -------------------------------------------------------------------- News: Version 6.4 released! ==================================================================== Working toward version 6.5, Tungstenberry* release 1) In "Bash, versions 2, 3, and 4" chapter, In the Version 3.0 section, At the Extended Brace Expansion discussion, Added "eval" workaround for parameterization. (Thank you, Emiliano G.!) 2) In "Special Characters" chapter, Fixed missing parenthesis at "pipe" entry. (Thank you, Adamas, for pointing this out.) 3) In "Internal Commands and Builtins" chapter, At "let" entry, added Jeff Gorak's correction to the return value "anomaly." 4) At references to "trinary" operator, noted the more common "ternary" usage. 5) In "External Commands" chapter: In "Miscellaneous Commands" section, At "dd" entry, added creating bootable flash drives example. 6) In "Filesystem" subsection of "System and Administrative Commands," Added "mkdosfs" entry. 7) In the Bibliography, added "AuctionGallery" entry. 8) Appendix D, revision of exit code 2 entry. 9) New cover for pdf version! * No such thing, but there most certainly ought to be. Version 6.4, Vortexberry* release 30 August 2011 1) In "Shell Programming!" chapter: Fixed format of block-quote on the BASIC language. 2) In the "Tests" chapter: Added a warning about whitespace in if [ "$a" = "b" ] test construct. Added a caution about the exit status of an arithmetic expression. (Thanks, ujqm8360, for the pointer.) 3) In "Variables Revisited" chapter: In "Manipulating Strings" section: In the first substring removal example, added instances of parameterization. 4) In "Testing and Branching" section of "Loops and Branches" chapter: Added footnote concerning optional left-paren in "case" statements. (Thank you, "amphiboly" and Jens Schweikhardt.) 5) In "Miscellany" chapter, In "Shell Scripting Under Windows" section, noted MSFT release of Windows PowerShell. 6) In "I/O Redirection" chapter: Added non-standard "input-file command > output-file" to opening examples. (Thank you, "amphiboly" and Jens Schweikhardt.) 7) In "Functions" chapter: Added a "single-command" instance to note about "compacted" functions. Added entry to "_()" example concerning ":()" function name. In "empty function" example, noted that a function containing only comments is still empty. (Thank you, Mark Bova.) 8) In "Bash, versions 2, 3, and 4" chapter: In "Bash, version 4" section, At "associative array" entry, added caution that index array elements containing only whitespace are not permitted. 9) In "Local Variables" section of "Functions" chapter: Added footnote concerning visibility of local variables in daughter functions. (Thank you, Thomas Braunberger.) 10) In "Here Strings" section of "Here Documents" chapter: Added an example of feeding the stdin of a loop from a here string. (Thank you, Seamus.) 11) In "Process Substitution" chapter: Added Bill Davidsen's example (Thanks!). 12) In "External Commands" chapter: In "Text Processing" section: At "tr" entry, added "Just another Bash hacker!" example script. snippet (courtesy of a Wikipedia article). In "Math Commands" section: At "dc" entry, elaborated first example and added one line of explanation. 13) In "Debugging" chapter: At "trap" entry, added Graham Ewart's "progress bar" script. (Thanks!) At "set -u" entry, correction and example snippet added. 14) In "Bash, versions 2, 3, and 4" chapter, In the Version 3.1 section, Corrected the "+=" entry (Thanks, Ajoy Thamattorr). 15) In "Writing Scripts" section of "Exercises" appendix: Added "ASCII to Integer" exercise to Intermediate section. 16) In "Contributed Scripts" appendix: Added "sam.sh" Morse code practice script. Added "gronsfeld.bash" Gronsfeld Cipher script. 17) Fixed "base64.sh" script. It works now. 18) Epub version of ABS Guide now available, thanks to Craig Barnes. 19) Miscellaneous bugfixes, minor improvements, and URL updates. * Vortexberry bushes are nowhere to be found. They were all uprooted by rampaging unicorns. Version 6.3, Swozzleberry* release 30 April, 2011 1) Added brief coverage of Bash 4.1/4.2 releases. Read -N. Negative array indices. Negative parameter in string extraction. Bash now recognizes \u unicode escape. There is a new "lastpipe" shell option. etc. 2) In "Shell Programming!" chapter, Fixed the URL on the Christensen quote. (Thanks, Ilario Fav.) 3) In "Special Characters" chapter, Revised "?:" trinary-construct entry. Added $' ... ' entry. Added definition of ASCII. 4) In the "Tests" chapter, At "-p" entry, added Carl Anderson's example. 5) In "Introduction to Variables and Parameters" chapter: In "Variable Substitution" section: Corrected comment concerning when variables appear "naked." Removed comment about non-portable behavior of uninitialize variables in arithmetic expressions. (Thank you, Jeffery Haemer.) Added footnote that $0 does not always return the script name. (Thank you, Gregg Leichtman!) 6) In "Internal Commands and Builtins" chapter, At "let" entry, added caution about misleading exit status returned in certain situations. (Thank you, Evgeniy Ivanov.) In "Job controls" subsection, added footnote that "wait" can only take PIDs of child processes as arguments. (Thank you, Simon Haller.) 7) In "I/O Redirection" chapter: Fixed commentary on "ls -yz 2>&1 >> command.log" example. (Thank you, Teika Kazura.) 8) In "max.sh" example script, fixed comment. (Thank you, Robert Bruntz.) 9) In the "Bash, versions 2,3, and 4" chapter, removed the "{X..d..2}" example. (Thank you, Jeffrey Haemer, for the pointer.) 10) In "Bash, versions 2, 3, and 4" chapter, In the Version 3.1 section, At the "+=" entry, added Jeffrey Haemer's $PATH append example. 11) In "Local Variables" section of "Functions" chapter: Added note about return value of setting local variable. (Thank you, Evegniy Ivanov.) 12) In "Complex Commands" section of "External Commands" Chapter: At "xargs" entry: Added tip about using the -P option to run processes in parallel. (Thank you, Roberto Polli.) 13) In "Here Documents" chapter: Added footnote about using <<- to suppress tabs allowing closing limit string to deviate from the first column on a line. (Thank you, Dennis Benzinger.) 14) In the "Miscellany" chapter: Fixed the URL on Moshe Jacobson's utility (changed it to point to the "ansi-color" script). Then, decided to rehost Jacobson's original source code on webofcrafts.net. (Thank you, qun-ying, for pointing out the broken URL.) 15) In the "Variables Revisited" chapter: In "Parameter Substitution" section: Revised the "${parameter:?err_msg}" entry, per Kevin LeBlanc (thanks!). 16) In "Process Substitution" chapter: Added "psub.bash" example of redirecting output of process substitution into a loop. (Thanks, Diego Molina!) 17) Reference cards: Revisions, per Kevin LeBlanc (thanks!). 18) Added a snippet from Andrzej Szelachowski's ~/.bash_profile file to the ".bashrc" Appendix. (Thanks!) 19) In "/dev" section of "/dev and /proc" chapter: Expanded Mark's command-line time-fetch example into a short script. 20) In "Network" subsection of "System and Administrative Commands," Added "iptables" entry. Moved "nmap" and "netstat" entries here. 21) Added "Network Programming" chapter. Moved "test-cgi.sh" script here from TODO section. 22) In "Escaping" section of "Quoting" Chapter: Broke out $' ... ' string-expansion as a separate topic. (This was a long-overdue fixup.) 23) New scripts: read-N.sh here-commsub.sh neg-array.sh neg-offset.sh base64.sh ip-addresses.sh lastpipe-option.sh BashExtraKeys.sh (with thanks to Sigurd Solaas). Long in-line example at "Unicode" entry, with tie-in to $' ... ' string-expansion. 24) In "Writing Scripts" section of "Exercises" appendix: Added "Unicode Table" exercise to Intermediate section. 25) Fixups on various typos. 26) Fixups on scripts. * Swozzleberry? There really is such a thing? It's a variant spelling of "swazzle," a sort of kazoo-like noisemaker used by puppeteers. Now, imagine a gourd-like berry that can be used to make funny sounds. . . . Version 6.2, Rowanberry release 17 March, 2010 1) In "Special Characters" chapter, At "comma operator" entry, fixed first example (comment spread over two lines). 2) In the "Tests" chapter, In the "Other Comparison Operators" section, Fixed up comment at "==" entry. (Thank you, Bruno Brant!) 3) Updated "ex18.sh" example. 4) Multiple fixups submitted by Ramses Rodriguez Martinez. (Thanks!) 5) In the "Variables Revisited" chapter: In "Parameter Substitution" section: fixed typo in example at "${var##Pattern}" entry. In "Declare" subsection: fixed "declare | grep HOME" example. (Thank you, Tom Olson.) 6) In "Here Documents" chapter: Added comment on colon being optional in "commentblock.sh" example. (Thanks, Mihkel Punga.) ====Reorganization==== 7) Broke out section 9.5, "Indirect References," as Chapter 27. 8) Moved "The Double-Parentheses Construct" to "Operations and Related Topics" chapter. 9) Moved "Operator Precedence" sectionto "Operations and Related Topics" chapter. 10) Created new "Manipulating Variables" chapter out of two sections of old "Variables Revisited" chapter. Revised examples at two entries. ====================== 11) Miscellaneous fixups of scripts and typos in text. Thank you, Henrique Abreu. Version 6.1, Buffaloberry release September 30, 2009 1) In "Shell Programming!" chapter, Added new sidebar to the intro text. 2) In Quoting Variables section of "Quoting" chapter, Revised double-quoting footnote about apparent inconsistent behavior of "\" ... (Thank you, Daniel Barclay for the heads-up!) 3) In "Special Characters" chapter: Added $[ ... ] integer expansion entry. At "&>" entry, added usage examples. 4) In "Tests" chapter: In "Other Comparison Operators" section: Expanded "compound comparison" section to include rihad's caution about -a and -o operators not "short-circuiting." At "[" entry, added footnote defining "token." 5) In "Internal Commands and Builtins" chapter, At "eval" entry, reworded intro and added material to first example. Subsequently rewrote first example once again, per suggestion by Gerrit. (Thanks!) Removed "eval.example" script, since it was misleading and confusing, per the suggestion of Nathan Coulter. Added footnote per Nathan Coulter to introductory paragraph. (Thanks!) 6) In "External Commands" chapter: In "Math Commands" section: At "dc" entry, added two short usage example, including a somewhat cryptic one (Golden Ratio calculation). Fixed typo (extra quoe at close) at inline "dc" example. (Thank you, Daniel Scott Matthews!) In "File and Archiving Commands" section: Added entry for "openssl," with usage examples. Added entry for "getfact" and "setfacl," with usage examples. Added two footnotes to "sum, cksum, md5sum, sha1sum" entry. In "External Commands" section: In "ex33.sh" example, changed "NO_ARGS=86" to "NO_ARGS=0" per alert from Gerrit. (Thanks!) 7) In "Variables Revisited" chapter: In "Parameter Substitution" section, Fixed typos at "${var%Pattern}, ${var%%Pattern}" entry. (Thank you, Donald White, for pointing this out!) At "${parameter-default}" entry, added snippet from revised "hanoi2.bash" script to usage example. In "Internal Variables" section, At "$DIRSTACK" entry, added footnote defining "stack." In "Indirect References" section, Added a sidebar explaining the actual process of constructing an indirect reference. At "unset" entry, added note linking to ${parameter:-default} parameter substitution construct. (Thank you, Timothy Redaelli, for pointing out the ambiguity here.) In "Internal Variables" section, Added $CDPATH entry. 8) In "Command Substitution" chapter: Enhanced "setting a variable to the contents of a file" in-line example. 9) In "Functions" chapter: At "exit status" entry, added statement relating function exit status to that of ordinary commands. 10) In "Bash, versions 2, 3, and 4" chapter: In "Bash, version 4" section, Corrected a typo in Substring Extraction entry example script. Removed quoting of matched variable with =~ operator. (Thank you, Thomas Güttler, for pointing this out.) 11) In the "Miscellany" chapter: In the "Portability Issues" section, Added Larry Wall epigraph. In the "Interactive and non-interactive shells and scripts" section, Added John Lange's examples using "if [ -t 0 ]" ... Added a new sub-subsection with a "test-suite.sh" script. 12) In "Process Substitution" chapter: Added instances to first usage example. Stylistic cleanups. 13) In "Exit and Exit Status" chapter, Added discussion of exit status of a _pipe_, including effect of prefixing the pipe with ! ... 14) In "Arrays Chapter, Fixed comment in "ex68.sh" example -- 1 is not a prime. Thank you, Gordon Hopper, for pointing this out. Fixed error in comment "ex67.sh" example. (Thank you Grigory Romanenkov, for pointing this out.) 15) In "Here Documents" chapter: Added cautionary note about the use of ! as a limit string. At quoting/escaping the limit string discussion, added Allen Halsey's explanation. (Thank you!) 16) In "Bash, versions 2, 3, and 4" chapter: At "coproc" entry, fixed examples and added commentary, courtesy of George Dimitriu. (Thanks!) 17) In "Endnotes" chapter: In "Where to Go For Help" section, Added "CI-300 printer manual" epigraph. 18) In "Bibliography" section: Added entry for Wikipedia article on "dc." Added entry for Philip Patterson's "logforbash" script. 19) Changed several instances of "print $9" to "print $8" in embedded awk scripts. (Thank you, Michal Nagy, for the heads up.) 20) Added a new appendix: "An Introduction to Programmable Completion." Added the following support scripts: "UseGetOpt-2.sh" and "UseGetOpt-2" 21) In "Contributed Scripts" appendix: Fixed up "hanoi2.bash" script so it doesn't crash with error if no params. (Thank you, Stephen Solomon, for the heads up!) Added "show-all-colors.sh" example script, courtesy of Chetankumar Phulpagare. 22) Updated download URL. 23) Cleanups/fixups to main text, appendices, and script examples where appropriate. Version 6.0, Thimbleberry release March 23, 2009 1) Changed the title of Chapter 1. 2) Updated "copy-cd.sh" and "ex40.sh" examples to reflect changes in cdrtools. 3) In "Special Characters" chapter: Added another instance in the "brace expansion" example. 4) In "Testing and Branching" section of "Loops and Branches" chapter: Clarified outline of "case" construct. 5) In "Internal Commands and Builtins" chapter: At "eval" entry, added "arr-choice.sh" example script. (Thank you, Antonio Macchi!) At "read" entry, added "-u" option. 6) In "Internal Variables" section of "Variables Revisited" chapter: Added $BASHPID variable (new to Bash 4+). At "$$" entry, noted that within a subshell, PID of script returned by $$. 7) In "Arrays" chapter: Added material to "array-function.sh" example script. 8) In "Variables Revisited" chapter: In "Indirect References" section: Fixed comment in "ind-ref.sh" example, thanks to Jakob Bohm. 9) In "External Commands" chapter: In "File and Archiving Commands" section: Added "pax" entry. 10) In "I/O Redirection" chapter: Added a couple of new instances on stderr redirection. Added comments on a couple of new operators added in ver. 4 of Bash that are still not functional. 11) In "Bash, versions 2, 3, and 4" chapter (new title!): In Version 3 section, more on quoting "=~" operator. Added instances in "brace expansion" example. Added a section for version 4 of Bash. Added "fetch_address.sh" and "fetch_address-2.sh" examples to illustrate associative arrays. Added "cas4.sh" example to illustrate enhancements to case construct. Added discussion of the new "coproc" command, with illustrative examples. Added discussion of the new "mapfile" command, with an illustrative example. Briefly mentioned a couple of the changes to "read" options. Listed the new -l and -c options to "declare" builtin, with a short illustrated inline script. Listed new upper/lowercase operators for parameter substitution, with example. Listed the new "brace expansion" options. Discussed change in the treatment of positional parameters in substring extraction. Discussed the new ** globbing operator and "globstar" shell option. Discussed the new "command_not_found_handle ()" error-handling function, with in-line example. Added an "editorial" sidebar. It is certain to generate controversy. 12) In "System Resources" subsection of "System and Administrative At "ulimit" entry, added footnote about -f, -c behavior in POSIX mode and newly-added options (ver. 4+ of Bash). 13) In "Process Substitution" chapter: Added "wr-ps.bash" while-read loop example. (Thank you, Tomas Pospisek!) 14) In "Gotchas" chapter: Samuli Kaipiainen supplied a corrected explanation for piping-to-grep misbehavior. 15) In the "Portability Issues" section of the "Miscellany" chapter: Added entries to list of features in Bash missing in traditional "sh." 16) In "Options" chapter: Added entries for "globstar" and "checkjobs" in the table. 17) In "Subshells" chapter: Added a few comments and a short in-line example. 18) In "Contributed Scripts" appendix: Added "fifteen.sh" (Fifteen Puzzle) example script. (Thank you, Antonio Macchi!) Added "hanoi2.bash" -- graphic version of "hanoi.bash." Added "hanoi2a.bash" -- alternate graphic version of "hanoi.bash." Had to remove "obj-oriented.sh" example because it only works with obsolete versions of Bash. Removed "ftpget.sh" script. 19) In "Download and Mirror Sites" appendix: Fixed a typo in the ABS Guide download URL. 20) In "Bibliography" section: Added Shell Script Games entry. Added Bash Hackers Wiki entry. Added mirror site for the official Bash FAQ. Added Greg's WIKI: Bash FAQ entry. Added joyent site. 21) Updated the Index with references to new material. 22) Numberous syntactical and stylistic fixes. Version 5.6, Worcesterberry release 01/26/09 1) In "Special Characters" chapter: At "#" (comments) entry, added example of comment embedded within a pipe. At "semicolon" entry, slightly revised comments. Corrected a typo in "filter" footnote ("rougly"). At "$IFS" entry, added sidebar defining the term "field." 2) In "Variables Revisited" chapter: In "Manipulating Strings" section: * Expanded first inline "Substring Replacement example, thanks to the suggestion from Zhiyi Liu. Also added explanatory footnote. * Fixed minor typo in "rand-string.sh" example script. (Thank you, Ethan Larson, for bringing it to my attention.) 3) In "Internal Commands and Builtins" chapter: At "let" reference, inserted footnote that the command cannot be used for setting string variables. 4) In "Regular Expressions" chapter: Added example snippet of use of POSIX character classes (excerpted from ktour.sh example). 5) In "Gotchas" chapter: Added entry about misuse of "let" command to set string variables. 6) In "Contributed Scripts" appendix: Added "ktour.sh" -- Knight's Tour -- example script. Added "msquare.sh" -- Magic Square -- example script. 7) In "Bibliography" section: Added http://bashcookbook.com entry. Word usage cleanups in a couple of entries. 8) Moved the download and mirror site URLs from the title page to the "Download and Mirror Sites" appendix (where they rightfully belong!). Removed http://personal.riverusers/~thegrendel/ URL. In Download and Mirror Sites" appendix: Gave Ronny Bangsund credit for graciously donating server space for a mirror site. Removed stale www.morethan.org URL. Updated document author's e-mal. 9) Updated sample "bashrc" file (Appendix K). 10) Cleanups/fixups to main text, appendices, and script examples where appropriate. Version 5.5, Farkleberry release 11/28/08 1) In Introduction to Part 1, Added _Webster's Dictionary_ epigraph. 2) In "Why Shell Programming?" chapter, Added Spenser epigraph at end. 3) In Quoting chapter, rewrote introductory paragraph. In "Quoting Variables" subsection, simplified introductory paragraph to eliminate confusion. 4) In "Special Characters" chapter: At "comma operator" entry, added discussion and usage example for string concatenation. (Thank you, Rory Winston!) 5) In "Introduction to Variables and Parameters" chapter: Minor revision of introduction. In "Special Variable Types" section: At "$0" entry, expanded footnote to include command-line meaning. Revised and expanded "ex19.sh" example. In "Bash Variables Are Untyped" section, slightly revised "int-or-string.sh"example 6) In "Tests" chapter: In "Nested if/then Condition Tests" section: Expanded and clarified in-line example. 7) In "Variables Revisited" chapter: In "Manipulating Strings" section, At "${string//substring/replacement}" entry, added deletion examples to inline script. Extended "substring-extraction.sh" example. Fixup on "paragraph-space.sh" example. In "Parameter Substitution" section, Expanded in-line example at "${!varprefix*}, ${!varprefix@}" entry. In "$RANDOM" section, In discussion of /dev/urandom, eliminated confusing reference to "dd." In "Typing Variables" section: Added subsection on using "declare" to identify variables. (Thank you, Dieter Plaetinck, for the idea.) Minor fixup and clarifications in "ifs.sh" example script. 8) In "Testing and Branching" section of "Loops and Branches" chapter: At "select" entry, fixed a typo ("but that this ..." --> "but this ..." 9) In "External Commands" chapter: In "Basic Commands" section: At "chattr" entry, added footnote that "s" option may not be implemented. In "File and Archiving Commands" section: Expanded"shar" entry. At "bzip2" entry, added reference to "bzcat." In "Time/Date Commands" section: Updated output of "time" command. In "Miscellaneous Commands" section, At "yes" entry, fix to example of writing "yes" as a function (outputs "y" rather than "yes"). In "Terminal Commands" section: At "tput" entry, added ordered list of examples using the command. In "Complex Commands" section: At "find" entry, clarified usage of numerical modifier with -mtime/-atime options. (Pedro Javier Gonzalo Castellanos brought my attention to this.) In "Math Commands" section: Once again revised "cannon.sh" example. 10) In "Regular Expressions" chapter: In "Globbing" Section, added footnote defining a "wild card" character. At [bracketed characters] section, clarified language to indicate a *single* character selected between each set of brackets. 11) In "Here Strings" section of "Here Documents" chapter: Reformatted introductory paragraph. Added comment to "prepend.sh" example script about using "sed." 12) In "Arrays" chapter: Fixed a couple of errors in "empty-array.sh" example. (Thank you again, Nathan Coulter!) Slightly expanded "array-ops.sh" example. 13) In "Functions" chapter: Added "recursion-demo2.sh" example script. Added note that "empty" functions are not permitted in scripts. (Thank you, Thiemo Kellner!) Added short example of rather strange _() function. 14) In "System and Administrative Commands" chapter: Added entry for "lid" (list groups/members). At "halt" entry, added warning about carelessly invoking. 15) In "Loops and Branches" chapter: In "Loop Control" section: Added Verlaine quote. 16) In "Bash Variables are Untyped" section of "Introduction to Variables" Added comments to "int-or-string.sh" example script. 17) In "Internal Variables" section of "Variables Revisited" chapter: At $IFS entry, fixed up confusing language in 'echo "$IFS" | cat -vte" usage example. At $PIPESTATUS entry, fixup in first usage example and cleanup of reduncancy in the introductory explanation. (Thank you, der.hans!) More or less rationalized capitalization at intro to entries. 18) In "I/O Redirection" chapter: Added footnote about data streams and peripherals. Updated URL of Chet Ramey's archived e-mail in footnote. (Thank you, David Huston!) 19) In "Of Zeroes and Nulls" chapter: Added Tennyson epigraph at beginning. 20) In the "Shell Wrappers" section of "Miscellany" chapter: In footnote, corrected location of xmkmf to /usr/bin. 21) In "Bash, versions 2 and 3" chapter: Renamed "ex79.sh" example to "cards.sh" and made minor revisions thereto. 22) In "Exit and Exit Status" chapter, Added footnote modifying statement about $? giving functions a return value. Modified 3 in-line examples snippets for improved legibility. 23) In "Aliases" chapter: Added footnote in introduction. 24) In "Operators" subsection of "Operations and Related Topics" chapter: Revised "integer variable" text and in-line example for increased clarity. At "Comma operator" entry, revised text and in-line example for increased clarity. 25) In "Bash, versions 2 and 3" chapter: In generalized brace expansion entry in-line example, showed that parameterization doesn't work. 26) In "/dev" section of "/dev and /proc" chapter: Modified intro to define what a "device file" is. 27) In "Writing Scripts" section of "Exercises" appendix: Rewrote "Home Directory Listing" exercise to save to a USB flash drive, rather than a now-obsolete floppy disk. Rewrote "Determinants" exercise in more elaborate detail. 28) In "Contributed Scripts" appendix: Added "sw.sh" (command-line stopwatch) example script. Thank you, Pádraig Brady! Slight mods to "life.sh" script. 29) Fixups on erroneous links in the index. 30) In "ASCII Table" appendix: A couple of fixups to "ascii.sh" script. 31) In "Important Files" appendix, Added /etc/passwd entry. 32) In "Bibliography" section: Added URLs to GNU sed and gawk reference manuals. Fixed typo in "Unix Power Tools" entry. 33) In "Revision History" appendix: Fixed minor formatting bug in the synopsis (line break in the URL). 34) Fixed up the tarball so it expands into its own directory, rather than in $PWD. This is in closer conformity to the UNIX standard. 35) Enforced consistent use of "command-line" term with embedded hyphen. 36) Cleanups/fixups to main text, appendices, and script examples where appropriate . . . especially to older scripts where the command/usage has changed over the years, e.g., self-exec.sh. Version 5.4, Angleberry release 07/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. However, the Copyright Appendix is invariant and may not be omitted. 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: 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 of "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 Life"). 34) In "Exit Codes" appendix: Added footnote with more information about out of range exit codes (thanks for tweaking my curiosity about this, Akira Huang). 35) In "Sed Micro-Primer" appendix: Added use of backslash as newline. Added example of operation(s) over an address range. 36) In "Bibliography" section: Added Pickover entry. 37) Clarifications in "Copyright" appendix. 38) Various minor edits to various example scripts. Version 1.1 release (major release) 01/06/02 1) Fix up comments in "weirdvars.sh" example. 2) In "Variables" chapter, slight wording change in first paragraph. 3) Slight changes to "ex9.sh" example. 4) Added redirection as an alternative remedy to the script hang problem with background commands in "Job Control Commands" section of "Internal Commands" chapter. 5) In "Text Processing Commands" section of "External Commands" chapter: Added "-q" option at "grep", with in-line example. Added usage example for "cut". Much more information on "uniq -c", and added "wf.sh" example. 6) In "Functions" chapter: Added more info on oversize (> 256) return values. Modified "ex62.sh" example. Reorganized "Local Variables" section. Added note that before function call, all variables within functions are local, not just those explicitly declared as such. 7) Add section on "Shell Scripting Under Windows" to "Miscellany" chapter. 8) In "String Manipulation" section of "Variables Revisited" chapter: Bugfix in comment in "%%" substring removal example. Added "cvt.sh" example at "%%" substring removal discussion. Added subsection on using "awk" functionality for string manipulation, with added "substring-extraction.sh" example. 9) In "$RANDOM" section of "Variables Revisited" chapter: Removed superfluous "note" icon at beginning of section. Added example of using "awk" rand() function to generate random numbers. 10) In "Command Substitution" chapter: Added discussion and example of extending Bash toolset. Added footnote about what exactly constitutes a "command". 11) In "System and Administrative Commands" chapter: Added "lastlog" command. More info on "route" and "netstat". Fixed reference to "crond" at "logrotate". Added "tmpwatch". Added "sar". 12) In "Miscellaneous Commands" section of "External Commands" chapter, added more info and an example to "dd". 13) In "Math Commands" section of "External Commands" chapter: Added an alternative method of invoking 'bc', with "alt-bc.sh" example. Added using "awk" math commands, with "hypotenuse.sh" example. 14) In "Archiving Commands" section of "External Commands" chapter, added footnote to "tar". 15) In "Bibliography" section: Cleaned up cross reference to University of Alberta site. Added comp.unix.shell newsgroup reference. 16) Made corrections to "symlinks.sh" and "symlinks2.sh" examples, per Dominik 'Aeneas' Schnitzer. 17) In "Starting Off With a Sha-Bang" chapter, clarified footnote explaining "magic numbers", per Stanislav Brabec's suggestion. 18) In "I/O Redirection" chapter, added stdout redirection instance, with example. 19) In "Sed and Awk Micro-Primer" appendix: Added $filename to in-line examples. Fixup on "END" command block description. 20) Added semicolons as necessary to terminate commands in Perl examples. 21) Added "History Commands" appendix. Version 1.0 (stable!), released 10/14/01 1) Quoted "$LOGFILE" in in-line example in "Scripting With Style" subsection of "Miscellany" chapter. 2) Added missing "/" in first footnote in Chapter 2 (thanks, Stepan Kasal). 3) Additional comments for "primes.sh" contrib script. Fixup in "ex72.sh" contrib script. 4) In "Job Control Commands" section of "Internal Commands and Builtins" chapter: Additional comment for footnote to "enable -f". Additional material on "wait" (preventing script hang after background command). 5) Added "Oddities" section to "Miscellany" chapter. o Script calling itself recursively, with illustrative example ("recurse.sh"). o Moved "Shell Wrappers" section from "Starting Off With a Sha-Bang" chapter to "Miscellany" chapter. 6) In "Local Variables and Recursion" section of "Functions" chapter: Defined "recursion" in more detail. 7) Modified in-line example in "Special Variable Types" section of "Introduction to Variables and Parameters". Thanks, John Villalovos for bringing a side effect of parameter substitution to my attention. 8) In "System and Administrative Commands" chapter: Added "setserial". Added "MAKEDEV". Added "mkbootdisk". Added "tcpdump". Added "strip". Added "chkconfig". Added "hdparm". Added "badblocks". Added "lsdev". More info on "uname". Added "top" to "Job Control" subsection. Moved "mknod" to "Filesystem" subsection. Moved "ps" and "pstree" from "Internal and Builtin" job control commands to this chapter. 9) In "Arrays" chapter, added "unset" for removing array elements or an entire array. 10) Added "Exercises" appendix. 11) In "Special Characters" chapter: Added "EOF" as attribute of "Ctl-D" control character. Added "(( ))". Added "?". Added ";;". Added field separator usage for ":". Added info on pipes. 12) In "System Commands" chapter, changed "cron" to more technically correct "crond". 13) In "Globbing" section of "Regular Expressions" chapter, added examples of "echo" doing filename expansion. 14) In "Test Constructs" section of "Tests" chapter: Enhanced "arith-tests.sh" example. Added "(( "$a" < "$b" ))" and "(( "$a" > "$b" ))" constructs. Added "(( "$a" <= "$b" ))" and "(( "$a" >= "$b" ))" constructs. Added "Testing Your Knowledge of Tests" section. Added some material to "ex10.sh" example. 15) In "Complex Commands" section of "External Commands" chapter: Added material to "ex45.sh" example. Fixed error in description of "expr index $string" Rewrote part of "expr" discussion. Added "idelete.sh" example at "find" listing. 16) Added testing for condition with "assert" function in "Debugging" chapter. Illustrative example, "assert.sh". 17) Added prepending a line to an existing file to "Assorted Tips" section of "Miscellany" chapter. 18) Added "Bash Variables Are Untyped" section to "Variables" chapter. Example "int-or-string.sh". Slight modification of "ex9.sh" example. Added special case of signal variables to "naked" variables. 19) Moved "$?" and "$$" for "Positional Parameters" subsection of "Variables Revisited" chapter to newly created "Other Special Parameter" listing, along with "$-", "$!", and "$_". 20) In "Variables Revisited" chapter: Added "Manipulating Strings" section. Swatted a couple of bugs in the first couple of drafts of this section. Added "$GLOBIGNORE" and "$LC_CTYPE". Added "$BASH_VERSINFO[n]". Added "$PIPESTATUS". More info at non-builtin Bash variables. 21) In "Arrays" chapter, added "${array:position}" construct in-line example. 22) In "Time / Date" section of "External Commands" chapter: Rewrote and corrected part of "at" entry. Added "zdump". 23) In "Text Processing Commands" section of "External Commands" chapter: Added example for "cut", per idea of Oleg Philon. Added yet another usage example for "wc". Added "recode". Added "zdiff" at "diff" entry. Added "zcmp" at "cmp" entry. Slightly revised "sort" entry. Revisions on "grep" entry. Added notation about "agrep". 24) In "/dev and /proc" chapter: Reorganization into two separate sections. Oleg Philon suggested a simplification for the "connect-stat.sh" example. 25) In "Miscellaneous Commands" section of "External Commands: Added "banner". Added "m4", with "m4.sh" illustrative example. Added "make". Added "hexdump". 26) In "File and Archiving Commands" section of "External Commands: More info on "file" entry. Added "znew" note at "compress / uncompress" entry. Added "zip / unzip". Added "vdir". Added "shred". 27) In "Math Commands" section of "External Commands" Corrected "EBCDCIC" to "EBCDIC". Very embarrassing. 28) In "Regular Expression" chapter: Added "()" and "|" to extended REs. 29) In "Communications Commands" section of "External Commands" chapter: Added "cu". 30) In "Of Zeros and Nulls" chapter, added "ramdisk.sh" example. 31) In "Appendix B", fixed error stating that "Both sed and awk use the -e option..." Only sed does (whoops!). Thanks to Peter S Tillier for pointing this out. 32) Clarification of version 2 of Bash in "Bash, Version 2" and "Gotchas" chapters. 33) Slight change to "symlinks.sh" example script, as suggested by Dominik 'Aeneas' Schnitzer. 34) Added note to "numbers.sh" example, at the suggestion of Chiron. 35) Folded "Credits" chapter into "Endnotes" chapter, as a section. It's more logical that way. 36) Added "Preliminary Exercises" section to Chapter 2. 37) Added setting a variable to the contents of a file to "Command Substitution" chapter. 38) In Bibliography, added Rosenblatt listing. 39) In "Command Substitution" chapter, back quotes (`...`) erroneous shown as single quotes ('...'). Fixed. Thanks, David Lawyer. 40) Fixed ambiguity in conditional test in "rpm-check.sh" example, in "Special Characters" chapter. Also fixed "ex9.sh". Again, thank you, David Lawyer. 41) Fixed "for loop" references (links led to wrong places). 42) In "Testing and Branching" subsection of "Loops and Branches" chapter, added "match-string.sh" example. 43) In "Loops and Branches" chapter, added example of "for" loop with stdout redirected to a file. 44) In "Redirected Code Blocks" section" of "I/O Redirection" chapter, added "redir4a.sh" example, showing redirection of both "stdin" and "stdout" of loop. 45) In "Shell Wrapper" section of "Starting Off With a Sha-Bang" chapter, added "bashandperl.sh" example. 46) Revised the introduction to the book. 47) Last minute cleanups of various example scripts. 48) New .bashrc from Emmanuel Rouat. Version 0.5, released 09/03/01 1) Changed the name of this file from "NEWS" to Change.log" 2) Reorganized subsections of the huge "Tutorial" chapter into separate chapters. This is much more logical. 3) Divided main section of the book into four parts. First paragraph of chapter 1 moved to Part 1 introduction. 4) Fixups on id tags for various subsections (Jade does not like "anchors" nested in within certain tags). 5) In "Tools Used" section, fixed typo in "OpenJade" URL. 6) Changed chapter heading from "End Notes" to more grammatically correct "Endnotes". 7) In "Regular Expressions" chapter: Fixed typo ("or" -> "of"). Added subsection for POSIX character classes. 8) Enhancements to "ex73.sh" example. 9) In "File and Archiving Commands" section of "External Commands" chapter: Added "de-rpm.sh" example of using "cpio". Added "ar". Reorganized into subsections. 10) Added dedication. 11) Corrected comment in "weirdvars.sh" example. Thanks, Prahad V. 12) Cleanups on "ex2.sh", "ex39.sh", "ex41.sh", and "logevents.sh" examples. 13) In "I/O Redirection" chapter, added cross references to "de-rpm.sh" and "fifo.sh" examples. 14) In "System and Administrative Commands" chapter Added "strace". Added "hostid". Added "nm". Added "vmstat". Added "fdformat". Added "erase.sh" example at "stty". More info on lock files. Reorganization of entries into logical sections. 15) Moved "Parameter Substitution" section from "Introduction to Variables and Parameters" chapter to "Variables Revisited". This is a fairly advanced topic. 16) Moved "Variable Assignment" and "Special Variable Types" information from "Variables Revisited" chapter to "Introduction to Variables and Parameters". These are introductory topics. 17) In "Miscellaneous Commands" section of "External Commands" chapter: Added "blot-out.sh" example for "dd". Added footnote explaining "EBCDIC" at "dd" Added "run-parts". 18) Changed to in various places, since the Docbook stylesheet does strange things with the former. 19) In "Tests" chapter: Fixup in footnote in "File Test Operators" subsection. Added note that "&&", "||", "<", and ">" work within "[[ ]]" construct. Rewrote "<" and ">" entries in "Comparison Operations" section. 20) In "Internal Commands" chapter: Added "-r" option to "read". Added "-f" option to "enable". Extended "ex47.sh" example at "printf" with "sprintf" simulation. Added more info to "cd" ("-P" option and "cd -"). Added "fg" and "bg" (how did I manage to leave these out before?). Added "logout". Added optional argument that "wait" may take. Added "autoload". Added table of "Job Identifiers". Reorganized chapter into subsections. 21) In "Text Processing" section of "External Commands" chapter: Added "crypto-quote.sh" example for "tr". Added another usage example for "wc". Added "tsort". Added "iconv". Added "lex" and "yacc". 22) More info added in "Aliases" chapter. 23) In "Parameter Substitution" section of "Variables Revisited" chapter: Added usage examples on "${param+alt_value}" and "${param:+alt_value}" Added in-line usage examples for "${var#pattern}" and "${var##pattern}". Added "${!varprefix@}" matching. Added "${var/#patt/replacement}" and "${var/%patt/replacement}", with illustrative example ("var-match.sh"). 24) Dedicated section to "Globbing". Added usage examples. 25) In "Variables Revisited" chapter: Added usage example of "declare -i" in "Typing Variables" section. Added material to "am-i-root.sh" example. Correction: "typeset" and "declare" are builtins, not keywords. Added "declare" option ("var=$value"). 26) Added $ LC_COLLATE, $SHLVL, and $FUNCNAME to "Variables Revisited" chapter. Noted adding "export LC_COLLATE=C" to /etc/profile to restore customary behavior of bracket set filename globbing. 27) Made "bubble.sh" more pedantically correct by quoting params within tests. 28) In "Assorted Tips" section of "Miscellany" chapter: Added inline example of a definition and function library. Added special-purpose comment headers. 29) Added "About the Author" section to "Endnotes" chapter. 30) In "Operations" section of "Operations and Related Topics" chapter: Added "**" exponentiation operator. Added note that Bash integers are of type 32-bit signed long, with in-line example. Added comma linking operator. Fixed and enhanced "&&" and "||" entries. 31) In "Parameter Substitution" section of "Variables Revisited" chapter, added "${!varprefix*}" expansion. 32) In "Communications Commands" section of "External Commands" chapter, Added "whois". Added "ping". Added "finger". Added "vacation". Added "ftp". Added "telnet". Added "rsh". Added "rlogin". Added "ssh". Added footnote defining "daemon". Reorganized commands into subsections. 33) In "Complex Commands" section of "External Commands" chapter, added usage example of "expr $string :" operations. 34) Clean up example scripts, and made them more stylistically consistent. Fixed error in "ex22a.sh". Fixed error in "arith-tests.sh". 35) Fixed erroneous reference to "ex74.sh" in "Of Zeros and Nulls" chapter (should be "ex57.sh"). 36) Corrections and additions to "DOS Batch Files" appendix, sent in by Marc-Jano Knopp. 37) In "Functions" chapter, noted that 256 is the largest positive integer return value, and added "return-test.sh" illustrative example. Showed how to "evade" this restriction, with "max2.sh" example. 38) Branched off "function redirection" into a separate sub-subsection. 39) Added integer variable test to "Assorted Tests" section of "Miscellany" chapter. 40) Added "days-between.sh" example to "Contributed Scripts" appendix. 41) Added "using same name for a function and a variable" to "Gotchas" chapter. 42) In "Special Characters" chapter: Fixed "pipes" example to reflect GNU syntax of "tr" (thanks, Elias Assman). Added note to "dot" character that in another context, it can be part of a Regular Expression. Added "$", variable substitution. Added "&", run job in background. Added "%", modulo and pattern matching operator. Added "/", filename path separator and division operator. Added "=", assignment and string test operator. Added "+", arithmetic addition and Regular Expression operator. Added "~+", print working directory. Added "~-", print previous working directory. Added "control characters". Reordered listings. 43) In "Arrays" chapter, added comment to "bubble.sh" example. 44) Added portability note to "ex51.sh". 45) Removed redundant and partially incorrect "relational tests" subsection from "Operators" section of "Operations and Related Topics" chapter. 46) In "Basic Commands" section of "External Commands" chapter: More options to "ls". 47) Added "Portability Issues" section to "Miscellany" chapter. 48) In "Bibliography": Updated Rick Hohensee assembler link. Added Sheer book listing. 49) Added "Effective Awk Programming", to Bibliography. ====================================================================================== Version 0.4, released 07/09/01 Comments: Complete revision. The document is now the equivalent of a 300-page book. Changes from version 0.3: 1) Substituted Emmanuel Rouat's new, improved Linux-specific .bashrc file for the old one. 2) In "External Filters, Programs, and Commands" section: More info on "sleep". Added "usleep". More info on "diff", with note about using it to recursively compare directories. Added "diff3". Added "sdiff". Added "cmp". Added example using "cmp", and cross referenced it to "exit status". Added "hwclock/clock". Added "locate/slocate". Added "whatis", with example script. Added "whereis". Added "od". Added "unexpand". Added "install". Added "crypt". Added "write". Added "compress/uncompress". Added "gettext". Added "printenv". Added "tput". More info on "fold" (-s option). More info on "patch". More info on "join". More info on "tar". More info on "tr". More info on "dd". More info on "logger". More options for "cat". More options for "cp". Added cautionary note to "tar". Added --count and --invert-match options to "grep". Extra options and code snippets for "find". Using "echo" to feed a command sequence into a pipe and set a variable, with illustrative code snippets. Added subsection for "Terminal Control Commands" (tput, clear, reset, script). Added subsection for "Math Commands" (factor, bc/dc). 3) Moved subsection on "Here Documents" to right after "I/O Redirection" (much more logical). 4) Added more reasons not to use shell scripts. 5) Added info about the "widtools" (widget tools) package to "Assorted Tips" subsection of "Miscellany". 6) Corrected "Born-Again Shell" to "Bourne-Again Shell" (thanks to Jan Svenungson for pointing this out). 7) In "System and Administrative Commands" section: Added "dumpe2fs". Added "tune2fs". Added "fdisk". Added "mke2fs". Added "fsck", "e2fsck", and "debugfs". Added script using "fdisk" and "mke2fs". Added "df". Added "du". Added "mesg". Added tip. Added "procinfo". Added "ac" Added "last" Added "tset" Added "getty" and "agetty". Added "chown/chgrp". Added "useradd/userdel". Added "logrotate". Added "dump/restore". Added "stat". Added "rdist". Added "losetup". Added "lastcomm". Added "mkswap". Added "swapon/swapoff". Added "newgrp". More info on "chroot". More info on "netstat". More info on "ifconfig". More info on "route". More info and example added on "mount". Added note to "umount". Usage example on "lsmod". Removed inappropriate spacing in "wall" listing and added note. 8) In "Internal Commands" section: Added "pstree". Added "type". Added "help". Added footnote on "forking". More info on "kill". Added example to "unset". More options and info added to "read". 9) Additional clarification of "for" loops. 10) Added using C-like syntax in a "for" loop to "Loops" section, with illustrative example. Did the same with a "while" loop. Cross-references to examples in "Miscellany / Assorted Tips" section. 11) Added using command substitution to generate [list] in a "for" loop. Same for a "case" construct. Examples added. 12) In "Variables Revisited" section, added C-type variable manipulation, using the ((...)) construct [Chet Ramey's Easter Egg, actually borrowed from ksh93]. 13) In "Gotchas" section, Added scripts with DOS-type newlines. Added script invoked with "/bin/sh" maybe not fully Bash-compatible. 14) In "Files" section, added ~/.bash_logout. 15) In "Variables Revisited" section, Moved note about certain variables not internal to Bash to a more logical location. Added short note about using /dev/urandom to generate (useless) random numbers. Added $LINENO to internal variables. Added illustrative script ("am-i-root.sh") to "UID" discussion. Fixed "dubugging" typo. 16) In "Bibliography" section, Added four sites for example shell scripts. Added reference to Rick Hohensee's shell-scripted virtual machine + assembler. 17) Added "mail-format.sh" to "Contributed Scripts" appendix. 18) In "Tests" section: Clearer definition of what "test" actually means. Add info about "-g", "-u", and "-k" flags. Clarified examples of "integer tests" (used if [ "$a" XX "$b" ] to illustrate). 19) Fixed syntax error in "ex45.sh" (embarrassing). 20) Added piping the output of a "for" loop to a command. 21) Mention /usr/include/sysexits.h as an attempt at systematizing exit status numbers. 22) Added "string.sh", a "Contrib Script" by Noah Friedman. 23) Alphabetized listing of internal Bash variables in "Variables Revisited" section. It looks more professional now. 24) Added subsection on "Nested Loops" to "Loops" section. Added illustrative example script. 25) Added subsection on "Nested if/then Condition Tests" to "Tests" section. 26) In "Here Documents" section, Added - option. Added passing parameters to body of here document, with examples. Added disabling parameter replacement by quoting or escaping. 27) In "Special Characters" section, Added info on "-" redirection operator. Added quotes (""). Added strong quotes (''). Added escape (\). Added backticks (`). Added using ":" for comment line (not recommended). Added "*". Added "$*" and "$@". Piping the output of command(s) to a script. More info on "!" operator. Annotated Alan Cox's one-liner script. Added "_" (underscore). 28) Reorganized "Loops" section; created new subsection and reshuffled. 29) Added instance of "unset" to when a variable appears "naked" (without the $ prefix). Thanks to Florian Wisser for pointing this out. 30) Rewrote "Command Substitution" section (formerly named "Backticks"). Split off "Arithmetic Expansion" as a separate section, and added material. 31) Added "bc" and "dc" to "External Filters" section, with elegant illustrative script by Heiner Steven. Added more info on "bc", with "monthlypmt.sh" illustrative example. 32) Added new section on "/dev and /proc". Added illustrative examples. 33) Made a number of corrections and clarifications, as pointed out by Heiner Steven. Thanks! Some UNIX flavors take a 4-byte magic number... Too many script headers on one line in "magic number" example listing. Example "ex2.sh", added comment that "> filename" is equivalent to "cat /dev/null > filename". Example "ex2.sh", quoted parameter. Omitting [list] in a "for" loop assumes "$@", rather than "$*". Clarified that a "flag" acts as a semaphore, rather than as a signal. Added comment that {code block} does not launch a subshell to "Special Characters" section. At his suggestion, added a couple of more examples on "~" in "Special Characters" section. Added his "allprofs" script to "Subshells" section (with modifications by HOWTO author). Noted that some substitution operators come from ksh93. Noted that a line of code in a script ending in a pipe character does not require an escape to continue to the next line. Code snippet on how to redirect "read" through an entire file, line by line. Added note that "declare" is Bash-specific. Added code snippet explaining use of $IFS with "read" Added alternate example of redirected "while" loop to "I/O Redirection" section. 34) Added comments to "Subshells" section. 35) In "strip-comments.sh" example script, changed "=" to "-eq" (bugfix). 36) Changed all instances of "white space" to "whitespace" for consistency (picky, picky). 37) Added pitfalls of variables in a subshell with illustrative example to "Gotchas" section. 38) Added using Bash-specific functionality in a Bourne shell script on a generic UNIX machine to "Gotchas" section. 39) Added another example to "List Constructs" section. 40) Added using positional paramters > $9, using {bracket} notation (thanks, Philippe Martin). 41) Added -N and -t file tests to "Tests" section. 42) In "Arrays" section: Added "q-function.sh" (Hofstadter's Q-function) as an illustrative example. Added "twodim.sh" simulation of a two-dimensional array. 43) Added two new entries to "Bibliography" section. 44) Added more info in "Quoting" section. 45) Bugfix: removed an extraneous header from "source/dot" command in "Special Characters" section. 46) Added a caution about confusing REs with "globbing" to "Regular Expressions" section. 47) In "Loops" Section: Added filename "globbing" in for-loop [list]. Added "break N", breaking out of multiple loop levels. Added "continue N", continuing at a higher loop level. Added footnote to "Loop Control Commands" subsection noting that "break" and "continue" are shell builtins. 48) Removed commented-out SGML code for article header. That makes it official that this document is a book. 49) Added new appendix on "Converting DOS Batch Files to Shell Scripts". 50) Added "findstring.sh", illustrative example for generating [list] in a "for" loop with command substitution and for "strings" command in "External Filters, Programs, and Commands" section. 51) More info on "exit status". 52) Added appendix for "Exit Codes With Special Meanings". 53) Added "!" to "Special Characters" section. 54) Added "==" to "Tests" section. 55) Added a couple of examples and more explanation to "Regular Expressions" section. 56) Extra notes on $BASH_VERSION. 57) In "Functions" section: Added directing the stdin of a function, with illustrative example. Added footnote to "return" command, noting that it is a Bash builtin. 58) Added "[[ ]]" construct to "Tests" section. 59) In "bubble.sh", fixed spelling of "Zaire" and changed "Kashmir" to "Kenya" (it was pointed out that Kashmir is not a country). 60) Added "file-info.sh", illustrative example of a variable containing the [list] in a "for" loop. 61) Added a section on "Scripting With Style", stylistic guidelines. * Script and function headers added. * Descriptive names for variables added. 62) Added "copy-cd.sh", a script for copying data CDs, to "Contributed Scripts" appendix. 63) In "Loops" section, separated "Loop Control Commands" ("break" and "continue") into a separate subsection. 64) Added note to "Tests" section that after "if", "test" or test brackets not strictly necessary. Similarly, test brackets do not necessarily require an "if" when used with "list constructions". 65) Once more, checked all the examples for stylistic correctness. 66) In "Variables Revisited" section: Added "random-test.sh", testing the randomness of RANDOM. Added "seeding-random.sh", reseeding the RANDOM generator. 67) Reshuffled some commands into different subsections in "External Filters, Programs, and Commands" section. 68) Added "isalpha.sh" example to "case" constructs in "Loops" section. 69) Added inline example in "Regular Expressions" section. 70) Moved "ex50.sh" from "pr" to "fmt" in "External Filters, Programs, and Commands" section. 71) Added "du.sh" example to "tr" in "External Filters, Programs, and Commands" section. 72) Clarification on ${var#pattern}, ${var%pattern} variable substitution in "Variables" section, and added "patt-matching.sh" example to illustrate. 73) Clarifications on "ex14.sh" example. 74) In "Internal Commands and Builtins", fixed explanation on "getopts" and associated "ex33.sh" to make usage consistent with accepted usage. (Thanks, Ueli Strasser) 75) Fixed typos: ("suppress" --> "suppresses") in "Here Documents section. ("inderect" --> "indirect") in "Variables Revisited" section. "Option" left out in "type" discussion. 76) More on "%" (modulo) operator in "Operations" section. 77) Added "> &FD" and "n<>filename" to "I/O Redirection" section. 78) Fixed bug in "ex2.sh" example (removed "or-list"), and added cautionary not on "or lists". 79) More explanation on meaning of "keyword". Noted that "!" is a keyword. 80) Moved "printf" and "eval" from "External Commands" to "Internal Commands" section. 81) Fixed up some cross-reference links. 82) In "Sha-bang" section: Added footnote with self-deleting script example. Added footnote about invoking script with "sh scriptname" turning off Added footnote about invoking a script with "./scriptname". Bash-specific extensions. Minor cleanups. 83) Cleaned up "filename" referenced. Made references to "stdin" and "stdout" consistent (). 84) Added footnote about "dotfiles". 85) Noted that "logname" is not exact equivalent to "whoami", with example. Correction: "trap 2" changes to "trap '' 2" in "Debugging" section. Thank you, Nick Drage. 86) Fixed typos pointed out by Hyun Jin Chan. Typo in "ex13.sh". Typo in "ex41.sh". In "Here Documents" section, changed "feeding input into non-interactive programs" to "feeding input into interactive programs". 87) Added footnote about "magic numbers" used in the context hard-wired constants in "Scripting With Style" section. 88) Added "End Notes" chapter, which includes "Author's Note" and "Tool Used to Produce This Book". 89) Added footnote about shell script naming conventions to "Why Shell Programming?" section of Chapter 1. 90) Changed all tags to the more appropriate . 91) Added info about Korean translation of the document to "Copyright" appendix. 92) Added "${#variable}" construct to "Parameter Substitution" subsection in "Introduction to Variables and Parameters" section, mentioning exceptional cases of "${#*}" and"${#@}". 93) Reorganized "I/O Redirection" section (subdivided into subsections). 94) Reorganized "Functions" section (subdivided into subsections). 95) Added example snippets to "Process Substitution" section. 96) Added Nick Drage's comments to "online.sh" in "Debugging" section. 97) Tidied up "Operations and Related Topics" section. 98) Fixed typos in "ex79.sh" ("suite" -> "suit"). 99) Fixed other minor typos in the document. 100) Stéphane Chazelas sent in long lists of corrections and suggestions. Bug fixes, improvements, and comments on "ex2.sh" example. Bug fixes and improvements to "ex3.sh" example. Improvement on "ex4.sh", "ex5.sh", and "ex14.sh" examples. Suggestion for "col-totaler.sh" example. Code snippet on use of "case" for parsing command-line args. In "brace expansion" discussion, pointed out that spaces permitted when quoted or escaped. Improved "ex8.sh" to read more than one line (more useful as an example). Resolve ambiguity about "-", which is not a Bash operator. Suggested workarounds for filenames starting with "-" used with "-" redirection operator. Added safer alternatives to "ex58.sh". In "Why Shell Programming?" section, modified footnote to state that user-written scripts with ".sh" extension should be Bourne shell compliant. In "Command Substitution" section: Added notes. Added explanation in code snippet on command output. Note that newline deletion may result from word splitting. Added example snippets of trailing newline deletion. In "Special Characters" section: Fixed typo at beginning of "#" (comment) listing. Added note about "#" not denoting a comment in certain constructs. "${parameter?err_msg}, ${parameter:?err_msg}" Added note that non-interactive script exits with code 127. Added note about escaping "#" in echo statements. Added caution about variable value starting with "-n". More on "~" expansion. Changed "noclobber" environmental variable (obsolete) to option. Added "array initialization" to "()" listing. Added notes to "brace expansion". Added notes and made corrections to "ex6.sh" example. Added note and example demonstrating that a code block in braces may run as a subshell. Clarification on "pipes". Note on Alan Cox's directory copy method. Noted that ":" is a shell builtin. Noted that ": >>" applies only to regular files. Fixed error about "code block" { ... }. Added note about variables defined within (...) not being visible to rest of script. Fixed error on "{}\" construct, and added note. Change to "uppercase.sh" in-line example. Added "{#array}" as string length of first element of array. Added cautionary note about reserved exit status codes to "Exit Status" section. In "Variables" section: Added comments and clarifications to "ex7.sh". Added comments and clarifications to "ex9.sh". Added info per his comments on the $'...' string expansion construct. In "Quoting" section: Added more examples of escaping a newline in variable assignment. Clarified and corrected info about quoting variables "echoed", with Added illustrative examples. Replaced flawed example snippet ("bash$ echo [Ff]irst") Fixed bug, changed ' to ` in referencing within double quotes. Clarified and corrected "toggling on" special meanings of characters by escaping. In "Tests" section: Added detailed explanation about "if/then" construct, "[", and "test". Added clarification about "[", "[[" , and "test". Added arithmetic tests using "(( ))". Added notes to "ex10.sh" example. Clarification on "ex12.sh", and moved it to "External Filters..." section. Pointed out that one should always quote a string being tested. Clarified what happens when erroneously putting a space in an assignment statement. Added example on using arithmetic operations (arithops.sh). Clarification and corrections on "-t" test option. Clarification on "-r" test option. Clarification on "-w" test option. Clarification on "-g" test option. Clarification on "-u" test option. Clarification on "-k" test option. Clarification on "-n" test option. Clarification on "str-test.sh" example. Clarification and example on "==". Clarification on pattern matching with "!=". Clarification on "&&" and "||" comparison operators. Fixup on "arith-tests.sh" example. Clarification and corrections on "ex14.sh" example. In "Operations" section: Fixed "=" in-line example. Fixed "+=" and "*=" example snippets. Fixed typo: 'if "Xstring1" = "Xstring2" ] is safer,'. Retitled subsections to avoid reader confusion. Added example snippet on using "&&" and "||" in an arithmetic context. Added note to "arith-ops.sh". Added note to "and-or.sh". Fixed typo (lost space) in in-line "&&" example. Clarified "numbers.sh" example. Clarification on "&&" and "||". In "Variables Revisited" section: More clarifications and example snippets + "ifs.sh" example for "$IFS". Clarified use of "$PATH" variable. Cleared up confusion on "$PPID". Cleared up confusion on "$@". Added "incompat.sh" and "ifs-empty.sh" examples on inconsistent "$*" and "$@" behavior. Plugged a possible hole in "wipedir.sh" example script and added comments. Added "timeout.sh", another example of timed input. Explanation (footnote) on environmental variables. Explanation (footnote) on parameter $0. Corrected "declare -f" listing. Clarification on "ind-ref.sh" example. Clarification on $SHELL variable. Clarification on $HOSTNAME variable. Added "col-totaler2.sh" as an example of indirect references. Fixed typo "that that". Fixup on "ex17.sh". Fixup on "ex20.sh". Added comment to "ex21.sh". In "Loops" section: Fixed error: semicolon *after* [list]. Additional clarification in "ex22a.sh" example. Quoted arguments in [list] in for-loop illustration. Removed reference to REs in filename globbing. Fixup and note added to "list-glob.sh" example. Added note to "bin-grep.sh" example. Added note to "ex24.sh" example. Correction on "ex26a.sh" example. In "case" constructs: Noted that variable quoting not mandatory. Corrected and clarified comment in command line parameter testing. Changed "regular expression" filtering to "globbing" filtering. Improved "isalpha.sh" example. In footnote, cleared up some confusion about builtins. Moved 'basename', 'dirname', and 'factor' from "Internal Commands" to "External Filters, Programs, and Commands" section. Minor clarification on "read-redir.sh" example. Alternatives added to "realname.sh" example. In "Internal Commands and Builtins" section: Corrections on "ps", "suspend", "command", and "builtin". Moved "echo", "cd", and "let" here from "External Commands" section. Note on "echo" deleting linefeeds in command output. Added in-line examples for "echo". Correction on "find" (-exec). Added "col-totaler3.sh" as an example of using "export" to pass a variable to an embedded awk script. Removed "stop" (how the heck did a "csh" command sneak in?). Removed "." from examples of builtins. Minor fixup on "ex33.sh" example. Added cautionary note on "eval". Added examples ("rot13_2.sh") to "eval". Added long note to "jobs" command clarifying difference between jobs and processes. Added in-line example on "printf". Clarified "keyword" definition. Fixed typos in "read" and "find" command subsections. In "External Filters, Programs, and Commands" section: Clarifications on "chmod" and "chattr". Added alternative method in "ex57.sh" example. Clarification on "ex42.sh" example. Clarification on "ex44.sh" example. Clarification on "ex45.sh" example. Option "-c" to "uniq" discussed. Correction on "cut". Clarification on "colrm". Clarification on "join". Clarification on "head", and added example "rnd.sh". Concise form of "lookup.sh". Clarification on "gs". Added notes on "wc" (and fixup of example). At "grep": Additional minor fixups. Note in "grp.sh" script. Added usage examples for "-c" and "-z" options. Added note on "time" about it becoming a reserved word. Clarification and corrections on "tr". Clarification in "ex49.sh" and "rot13.sh". Added alternative code to "lowercase.sh". Added note to "fmt" about Kamil Toman's "par" utility. Added note to "line-number.sh" script about '-ba' option to 'nl'. Clarification and fixup on "pr". Added note to "zcat". Added alternative code to "strip-comments.sh". Fixed "lp". Added two usage examples for "yes". Added altenative methods to "find" in-line example. Fixed format in "cat/tac" in-line example. Added long note to "xargs". Added note to "touch", and link from ":" in "Special Characters" section. Fixup on "zcat" in "gzip" subsection, and fixed typo there. At "dd": Added usage examples". Fixed comments "dd-keypress.sh". Fixed typo on "grep". Explanatory note on "-maxdepth" option for "grep". In "System Commands" section: Moved "shopt" to "Internal Commands and Builtins". More info on "who". Correction and clarification on "hostname". More info on "env". Added "lsof". Clarification on "pidof". Moved "exec" to "Internal Commands and Builtins" and made some corrections in the commentary. Using "stty" to detect keypress, with illustrative example. Fixup on "chgrp". Fixup on "nice". Fixup on "sync". Added "createfs" example to illustrate "losetup". At "stty", added long sidebar explaining canonical mode in terminals. Fixup and additional illustrations on example. Additional commentary on "ifconfig" code snippets. Clarifications in "Arithmetic Expansion" section. In "I/O Redirection" section: Added note to "redir1.sh" example. Added note to "redir2.sh" example. Clarifications and notes added on "redir2a.sh", "redir3.sh", "redir4.sh", and "redir5.sh" examples. Added ": >" file truncation note. Added examples (programlisting) of word splitting. Added example of newline deletion. Fixups (removed extraneous spaces in redirection operators in example snippets). Added alternative forms of operators that close file descriptors. Added note and code snippet to "Closing File Descriptors" subsection. Added "logevents.sh" example of using redirection operations in event logging. Added example snippet for "[j]<>filename". In "Gotchas" section: Fixed errors in using bad variable names. Stylistic notes added. Added note about attempting to use "-" as redirection operator. Added notes and in-line example snippets about mixing up "=" and "-eq". Correction on making script "suid". Corrections and explanatory notes in "Regular Expressions" section. Notes about "+" and curly brackets in "gawk". Note and example ("newline.sh") about using "." to match newlines. Footnote about matching dotfiles with globbing. In "Subshells" section: Fixup on in-line example. Added example of subshell redirection. Setting up a "dedicated environment" for a command group. Added comment to code snippet illustrating parallel processes. Added note about I/O redirection to subshells. In "Functions" section: Fix up and elaborate "ex60.sh" example. Example ("ref-params.sh") of passing reference parameters to functions. Comments and example on recursion. Note and example snippet on declaring functions before calling them. Note and example snippet on nested function. Note and example snippet on function declarations in unlikely places. Note and example snippet on using dedicated variables for return values. Note and example snipptets on an alternative method of redirecting the stdin of a function. In "List Constructs" section: Note and example snippets on operator precedence in compound statements. In "Arrays" section: Added notes to "ex67.sh". Added alternative implementation to "ex68.sh". Added notes and example snippet on ${xxx[@]} and ${xxx[*]} notation. Added notes to "twodim.sh" example. Added "{#array}" as string length of first element of array. Added "empty-array.sh" example. In "Files" section, clarification on "/etc/profile". In "Exit and Exit Status" section, added clarifying notes in in-line example. In "Here Documents" section: Added note to "ex71.sh". Fixup on "ex71c.sh". Added note and example on "anonymous here documents". Removed caution about pagers not working in a here document. Added note about temporary files used by here documents. In "Zeroes and Nulls" section, added note about ": >" alternate to "cat /dev/null >". In "Process Substitution" section: Fixed error in note about not leaving space between ">(command)". Changed "(command)>" to correct ">(command)". Added example snippets. In "Debugging" section: Added commentary after "test24, another buggy script". Correction on "exit" sending signal 0. Added note and example ("vartrace.sh") in trapping discussion. Notes added to "online.sh". In "Miscellany" section: Added using "[[ ]]" and "(( ))" in comparisons. Corrections in discussion of interactive shells, plus illustrative example. In "Contributed Scripts" appendix: Added "primes.sh" to demonstrate that arrays are not need to generate prime numbers. Added comments to "manview.sh" Added comment to "tree.sh" Added "obj-oriented.sh" example of object-oriented programming in a script. Fixed error in comment in "pw.sh" Notes on "string.sh". In "Sed and Awk Micro-Primer" section, corrections, clarifications, additions, and more examples. In "Sample .bashrc File" appendix, correction pointing out that only interactive shells read ".bashrc". In "Sha-Bang" section: Added note about the "#!" line being interpreted as a comment by the command interpreter. Added note about script needing read, as well as execute permission. Added note about starting a "README" file with "#!/bin/more". In "/dev and /proc" section: Added note that /dev/sndstat has been eliminated as of the 2.3 kernel. Clarification on virtual devices. Simplified code snippets illustrating "extracting data" from /proc files. Noted that /dev is not a filesystem. Added commentary to "pid-identifier.sh" example. Fixed error in footnote: entries in /dev do take up some space. In "Options" section: Clarified "-c" option. Added note to "-u" option. Fixed typo (--arg1arg2) on "--" (changed to "-- arg1 arg2") In "Converting DOS Batch Files" section: Removed unnecessary variable from "viewdata.sh" example. Fixups on tables of DOS batch file / shell script equivalents. In "Scripting With Style" section: Fixup on example script. Noted that "exit status" of a script is available to the parent process of that script, not necessarily the shell. Rewritten version of "example 3-2". Added "A Detailed Introduction to I/O Redirection" appendix. Added "Localization" appendix. Made corrections. ====================================================================================== Version 0.3, released 02/12/01 Comments: Another major improvement. The HOWTO is nearly book length, still evolving toward becoming a GUIDE. Changes from version 0.2: 1) Fixed: Renamed Example A-2 in Appendix A (Contributed Scripts appendix) to "encryptedpw". It had previously been named "manview", duplicating the title of Example A-1. 2) In Chapter 1, the reader is now advised to use the example scripts (something-or-other.sh), as an alternative to laboriously cutting-and-pasting from rendered HTML. 3) In "Special Characters" section, added brace expansion {xxx,yyy,zzz...}. 4) Deleted the erroneous statement that the "set -r" option cannot be invoked from within a script. 5) Added section for "restricted shells" with additional info. 6) Added a couple of script options. 7) Fixed minor bug in code snippet in "Interactive Scripts" section. 8) More info on interactive scripts. 9) Fixed an error confusing '$#' with '$*' in "Loops" section and in ex23.sh. 10) Added Antek Sawicki's random password script in contrib scripts. In "External Filters, Programs, and Commands" section: ------------------------------------------------------ 11) More accurately described the "{} \;" arguments to "find" command. Thanks to Jim Van Zandt for pointing this out. 12) Added note to "xargs" that "echo" is default command. Again thanks to Jim Van Zandt. 13) Fixed error claiming "diff" needs sorted files. Jim Van Zandt again. 14) Cleared up ambiguity about "colrm". 15) More info on "umask" and corrections. 16) Added "mkfifo". ------------------------------------------------------ 17) Added cross-reference on "&&". 18) Added cross-reference to embedded sed script. 19) Added example of embedded awk script (col-totaler.sh). 20) Fixed clumsy wording in sed and awk description. 21) Added "su" to "System and Administrative Commands" section. 22) Added Jim Van Zandt's "daily backup" example script to "Contrib-Scripts" appendix. 23) Enhanced example 66 (ex66.sh) on arrays with more methods of initializing array variables. 24) Corrected "Siever" entry in bibliography. 25) Added Jordi Sanfeliu's "tree" script to "Contrib-Scripts" appendix. 26) Added Robbins' "Bash Reference Card" to bibliography. 27) Added reference to Duarte's sed tutorial in bibliography. 28) Added "rn.sh", file rename utility to "Contrib-Scripts" appendix. 29) Added "initializing multiple variables on same line" to ex9.sh. 30) Fixed title on "ex52.sh". 31) Added a case when not to use shell scripts, in intro. 32) Added shell script as embedded command in another script, Tcl or wish script, etc. to "Miscellany / Assorted Tips" section. 33) Added download link for latest version of document to intro. 34) Added "id" to "System and Administrative Commands" section. 35) Added "stty" to "System and Administrative Commands" section. 36) Added "strip-comments.sh" example to illustrate "file" command, and "rot13.sh" example to "tr" command, in "External Filters" section. 37) Added "modular approach" sidebar to Chapter 2, section 1. 38) Added example cross-references to use of REs in scripts by sed, awk, and Perl. 39) More info and clarification on command substitution and arithmetic expansion in "Backticks" section. 40) Corrected "Bibliography" section entry for Ben Okopnik's introductory Bash scripting articles in "Linux Gazette". 41) Added "Bibliography" section entries for "Bash-Prompt HOWTO" and "Bash-Programming-Intro HOWTO". 42) Added $OLDPWD, $BASH_VERSION, $DIRSTACK, $HOSTNAME, $PPID, $MACHTYPE, $HOSTTYPE, $OSTYPE, $UID, $EUID, $SHELLOPTS, $IGNOREEOF, and $GROUPS to internal Bash variables in "Variables Revisited" section. 43) Added info on the "-" operator (may also be interpreted as "old working directory", depending on context). 44) Added collecting favorite definitions and functions into "library file" to "Miscellany / Assorted Tips" section. 45) Added cross reference from "dot" command to "source", later on in tutorial. 46) In "Special Characters" section, noted that a command may not follow a comment on the same line. 47) Added section on "Aliases", including two example scripts. 48) Added discussion of "for" loops with multiple parameters in each [list] element to "Loops Section". 49) Added discussion of "while" loops with multiple conditions to "Loops Section". 50) Added cross-reference to mention of "getopts" in "while loops" discussion. 51) Added cross-reference on "exec" in "System and Administrative Commands" section back to use of "exec" in "find" command sequence in "External Filters, Programs, and Commands" section. Added other cross-references in this section. 52) Added footnote about fd 5 being reserved to "I/O Redirection" section. 53) Additional discussion in "I/O Redirection" section. 54) Added using "exec" to redirect stdin to "I/O Redirection" section. 55) Added "redir1.sh", example of I/O redirection using "exec". 56) Added "redir2.sh", example of I/O redirected "while" loop. 57) Added "redir3.sh", example of I/O redirected "until" loop. 58) Added "redir4.sh", example of I/O redirected "for" loop. 59) Added "redir5.sh", example of I/O redirected "if/then" test. 60) Added "wipedir.sh" example to $PWD listing in "Variables Revisited" section. 61) More cross-references in "I/O Redirection" section. 62) Added "grp.sh", 'grep' emulation script, after 'grep' listing in "External Filters, Programs and Commands" section. 63) Added "nice", "arch", "users" , "logname", "dmesg", "groups", "hostname", and "pidof" to "System and Administrative Commands" section. 64) Added "bzip2", "sq", "rev", "strings", "pathchk" and references to "egrep", "fgrep" , "groff, gs, TeX", "column", "look", "ptx", "chattr", "cal", "nslookup", "traceroute", "dig", "rx/sx", "rz/sz", "uucp", and "sum, cksum, md5sum" to "External Filters, Programs and Commands" section. Also added illustrative examples for "column" and "look". 65) Added bibliography entries for GNU "gawk" reference manual and "groff" tutorial. Also for I/O reference on UAlberta site. 66) Added cross-references to script examples to "zcat" and "mv" commands" in "External Filters, Programs and Commands" section. 67) Clarification on [ -n $string ] string test operator. Added illustrative example (str-test.sh). 68) Added "lp" and related commands to "External Filters, Programs and Commands" section. 69) Added double-quoting variables to "Gotchas" section. 70) Added more xrefs to examples in "Variables Revisited" section. 71) Added "PS3" and "PS4" to "Variables Revisited" section. 72) Added enabling script options from #! header to "Options" section. 73) Added double backslash (\\) to "Quoting" section. 74) Added "Sed and Awk Micro-primer" appendix. 75) Fuller explanation of differences between "$*" and "$@" in "Variables Revisited" section. Also added example to illustrate this, "arglist.sh". 76) More cross-references to examples in "System and Administrative Commands" section. 77) Added more detail to description of $PATH, in "Variables Revisited" section. 78) Added more detail to "Files" section. 79) Added "command", "enable", , "builtin", "host", and "vrfy" to "Internal Commands and Builtins" section. 80) Moved "umask" from "External Filters, Programs, and Commands" to "System and Administrative Commands" section. 81) Rearranged the entries in "External Filters, Programs and Commands" in somewhat more logical order and subdivided the section into logical subsections. 82) Moved discussion of embedded Perl scripts from "System and Administrative Commands" section to "Shell Wrappers" subsection. 83) Added example .bashrc file, thanks to Emmanuel Rouat. 84) Many minor changes not listed above. ==================================================================== Version 0.2, released 10/30/00. Comments: This is a major improvement over 0.1. Changes from version 0.1: Bugfixes 1) fixed if [ cond1 && cond2 ] ==> if [ cond1 ] && [ cond2 ] if [ cond1 || cond2 ] ==> if [ cond1 ] || [ cond2 ] Added -a and -o options if [ cond1 -a cond2 ] if [ cond1 -o cond2 ] Added 'and-or.sh' as new example to illustrate && and ||. 2) Corrected ex6.sh, added $'s in front of {USER?} and {MAIL?}, and added additional explanatory material. 3) Noted that "-" is not a bash option. Other changes 4) ex55.sh: added note that 'killall' is Red Hat specific 5) Added to 'Gotchas': interchanging -eq and = starting variables with a digit 6) Substituted for Samuel Johnson quote at beginning: "...there are dark corners in the Bourne shell, and people use all of them." --Chet Ramey 7) Added reference to /usr/doc/initscripts-X.XX/sysconfig.txt just after ex. 3-52. 8) Added reference to 'nl' in "External Filters" section and illustrative example. 9) Added material to 'cat' listing. 10) Added: cd source-directory tar cf - . | (cd ../target-directory; tar xzf -) to Alan Cox example as an alternative. 11) Added material & example to {} 12) Added "Renaming file extensions" example to pattern matching section. 13) Added "Bash F.A.Q." and "sed F.A.Q." to references. 14) Added missing line in "Tests" section. 15) Revised the 'abstract'. 16) Added element. 17) Reorganized: Moved two examples placed erroneously in 'backticks' section to where they belong. 18) Fleshed out section on 'subshells'. Added 2 examples. 19) Rewrote text to first 'variables' section. 20) Added "rpm-check.sh" example to "code blocks" discussion. 21) Added "online.sh" example to "trap" discussion. 22) Expanded "I/O Redirection" section Definition of 'file descriptor' added. More on file descriptors 3 - 9. 23) Expanded "Regular Expression" section. 24) Added explanation of signals to "debugging" section. 25) Added SECONDS and REPLY to internal variables listing (plus illustrative examples). 26) Added 'ulimit' to administrative commands listing. 27) Added more information on 'trap' in 'Debugging' section. 28) Fixed erroneous '==' reference in 'Variables Revisited section. 29) Added 'jobs', 'ps', and 'nohup' to 'Administrative Commands' section. 30) Added additional entries to file tests in 'Tests' section. 31) Added additional entries and much more detail in 'Options' section. 32) More detail on 'grep'. 33) More detail on 'export'. 34) Added entries to file and string tests. 35) Added 'uptime' to 'System and Administrative Commands' section. 36) Added '~' to 'Special Characters' section. 37) Added material to 'Backquotes' section. 38) Added 'which' to 'External Filters and Commands' section. 39) More detail on parameters to functions. 40) More detail on arrays. 41) More detail on 'at'. 42) More detail on $RANDOM. Expanded example. 43) Added example script to demonstrate timed input. 44) Added 'Representation of Numerical Constants' subsection to 'Operations' section. 45) Added "eval var1=\$$var2" indirect reference notation to 'Variables Revisited' section. 46) Reorganized: Moved 'Parameter Substition' discussion from 'Special Characters' section to 'Variables' section. Added extra illustrative code snippets. 47) Added bubble sort example to 'Arrays' section. 48) Added %= operator to 'Operations' section. 49) Added reference to 'whoami' to 'System and Administrative Commands' section. 50) More detail and an additional example for 'Quoting' section. 51) Added info on using pattern match operator, ${var/patt/}, for deletion. 52) More detail on 'touch' and 'read' in 'External Filters'. 53) More detail on 'null' operator (:). 54) Some of the preexisting examples revised, with more material. 55) 'Miscellany' section added. subsection 'Interactive Scripts' subsection 'Optimizations' subsection 'Assorted Tips' 56) Contrib script section added. 4 scripts so far. 57) Expanded 'Credits' section. 58) Many other corrections, minor changes, and additions. ==================================================================== Version 0.1 released 14 June, 2000.