Advanced Bash-Scripting Guide
 

Dedication

For Anita, the source of all the magic

List of Examples
2-1. cleanup: A script to clean up the log files in /var/log
2-2. cleanup: An enhanced and generalized version of above script.
3-1. exit / exit status
3-2. Negating a condition using !
4-1. Code blocks and I/O redirection
4-2. Saving the results of a code block to a file
4-3. Running a loop in the background
4-4. Backup of all files changed in last day
5-1. Variable assignment and substitution
5-2. Plain Variable Assignment
5-3. Variable Assignment, plain and fancy
5-4. Integer or string?
5-5. Positional Parameters
5-6. wh, whois domain name lookup
5-7. Using shift
6-1. Echoing Weird Variables
6-2. Escaped Characters
7-1. What is truth?
7-2. Equivalence of test, /usr/bin/test, [ ], and /usr/bin/[
7-3. Arithmetic Tests using (( ))
7-4. arithmetic and string comparisons
7-5. testing whether a string is null
7-6. zmost
8-1. Greatest common divisor
8-2. Using Arithmetic Operations
8-3. Compound Condition Tests Using && and ||
8-4. Representation of numerical constants
9-1. $IFS and whitespace
9-2. Timed Input
9-3. Once more, timed input
9-4. Timed read
9-5. Am I root?
9-6. arglist: Listing arguments with $* and $@
9-7. Inconsistent $* and $@ behavior
9-8. $* and $@ when $IFS is empty
9-9. underscore variable
9-10. Converting graphic file formats, with filename change
9-11. Alternate ways of extracting substrings
9-12. Using parameter substitution and error messages
9-13. Parameter substitution and "usage" messages
9-14. Length of a variable
9-15. Pattern matching in parameter substitution
9-16. Renaming file extensions:
9-17. Using pattern matching to parse arbitrary strings
9-18. Matching patterns at prefix or suffix of string
9-19. Using declare to type variables
9-20. Indirect References
9-21. Passing an indirect reference to awk
9-22. Generating random numbers
9-23. Rolling the die with RANDOM
9-24. Reseeding RANDOM
9-25. Pseudorandom numbers, using awk
9-26. C-type manipulation of variables
10-1. Simple for loops
10-2. for loop with two parameters in each [list] element
10-3. Fileinfo: operating on a file list contained in a variable
10-4. Operating on files with a for loop
10-5. Missing in [list] in a for loop
10-6. Generating the [list] in a for loop with command substitution
10-7. A grep replacement for binary files
10-8. Listing all users on the system
10-9. Checking all the binaries in a directory for authorship
10-10. Listing the symbolic links in a directory
10-11. Symbolic links in a directory, saved to a file
10-12. A C-like for loop
10-13. Using efax in batch mode
10-14. Simple while loop
10-15. Another while loop
10-16. while loop with multiple conditions
10-17. C-like syntax in a while loop
10-18. until loop
10-19. Nested Loop
10-20. Effects of break and continue in a loop
10-21. Breaking out of multiple loop levels
10-22. Continuing at a higher loop level
10-23. Using case
10-24. Creating menus using case
10-25. Using command substitution to generate the case variable
10-26. Simple string matching
10-27. Checking for alphabetic input
10-28. Creating menus using select
10-29. Creating menus using select in a function
11-1. printf in action
11-2. Variable assignment, using read
11-3. What happens when read has no variable
11-4. Multi-line input to read
11-5. Using read with file redirection
11-6. Changing the current working directory
11-7. Letting let do some arithmetic.
11-8. Showing the effect of eval
11-9. Forcing a log-off
11-10. A version of "rot13"
11-11. Using set with positional parameters
11-12. Reassigning the positional parameters
11-13. "unsetting" a variable
11-14. Using export to pass a variable to an embedded awk script
11-15. Using getopts to read the options/arguments passed to a script
11-16. "Including" a data file
11-17. A (useless) script that sources itself
11-18. Effects of exec
11-19. A script that exec's itself
11-20. Waiting for a process to finish before proceeding
11-21. A script that kills itself
12-1. Using ls to create a table of contents for burning a CDR disk
12-2. Badname, eliminate file names in current directory containing bad characters and whitespace.
12-3. Deleting a file by its inode number
12-4. Logfile using xargs to monitor system log
12-5. copydir, copying files in current directory to another, using xargs
12-6. Using expr
12-7. Using date
12-8. Word Frequency Analysis
12-9. Which files are scripts?
12-10. Generating 10-digit random numbers
12-11. Using tail to monitor the system log
12-12. Emulating "grep" in a script
12-13. Checking words in a list for validity
12-14. toupper: Transforms a file to all uppercase.
12-15. lowercase: Changes all filenames in working directory to lowercase.
12-16. du: DOS to UNIX text file conversion.
12-17. rot13: rot13, ultra-weak encryption.
12-18. Generating "Crypto-Quote" Puzzles
12-19. Formatted file listing.
12-20. Using column to format a directory listing
12-21. nl: A self-numbering script.
12-22. Using cpio to move a directory tree
12-23. Unpacking an rpm archive
12-24. stripping comments from C program files
12-25. Exploring /usr/X11R6/bin
12-26. An "improved" strings command
12-27. Using cmp to compare two files within a script.
12-28. basename and dirname
12-29. Checking file integrity
12-30. uudecoding encoded files
12-31. A script that mails itself
12-32. Monthly Payment on a Mortgage
12-33. Base Conversion
12-34. Another way to invoke bc
12-35. Calculating PI
12-36. Converting a decimal number to hexadecimal
12-37. Factoring
12-38. Calculating the hypotenuse of a triangle
12-39. Using seq to generate loop arguments
12-40. Using getopt to parse command-line options
12-41. Capturing Keystrokes
12-42. Securely deleting a file
12-43. Filename generator
12-44. Converting meters to miles
12-45. Using m4
13-1. setting an erase character
13-2. secret password: Turning off terminal echoing
13-3. Keypress detection
13-4. pidof helps kill a process
13-5. Checking a CD image
13-6. Creating a filesystem in a file
13-7. Adding a new hard drive
13-8. killall, from /etc/rc.d/init.d
14-1. Stupid script tricks
14-2. Generating a variable from a loop
16-1. Redirecting stdin using exec
16-2. Redirecting stdout using exec
16-3. Redirecting both stdin and stdout in the same script with exec
16-4. Redirected while loop
16-5. Alternate form of redirected while loop
16-6. Redirected until loop
16-7. Redirected for loop
16-8. Redirected for loop (both stdin and stdout redirected)
16-9. Redirected if/then test
16-10. Data file "names.data" for above examples
16-11. Logging events
17-1. dummyfile: Creates a 2-line dummy file
17-2. broadcast: Sends message to everyone logged in
17-3. Multi-line message using cat
17-4. Multi-line message, with tabs suppressed
17-5. Here document with parameter substitution
17-6. Parameter substitution turned off
17-7. upload: Uploads a file pair to "Sunsite" incoming directory
17-8. Here documents and functions
17-9. "Anonymous" Here Document
17-10. Commenting out a block of code
17-11. A self-documenting script
20-1. Variable scope in a subshell
20-2. List User Profiles
20-3. Running parallel processes in subshells
21-1. Running a script in restricted mode
23-1. Simple function
23-2. Function Taking Parameters
23-3. Maximum of two numbers
23-4. Converting numbers to Roman numerals
23-5. Testing large return values in a function
23-6. Comparing two large integers
23-7. Real name from username
23-8. Local variable visibility
23-9. Recursion, using a local variable
24-1. Aliases within a script
24-2. unalias: Setting and unsetting an alias
25-1. Using an "and list" to test for command-line arguments
25-2. Another command-line arg test using an "and list"
25-3. Using "or lists" in combination with an "and list"
26-1. Simple array usage
26-2. Formatting a poem
26-3. Some special properties of arrays
26-4. Of empty arrays and empty elements
26-5. An old friend: The Bubble Sort
26-6. Complex array application: Sieve of Eratosthenes
26-7. Emulating a push-down stack
26-8. Complex array application: Exploring a weird mathematical series
26-9. Simulating a two-dimensional array, then tilting it
28-1. Finding the process associated with a PID
28-2. On-line connect status
29-1. Hiding the cookie jar
29-2. Setting up a swapfile using /dev/zero
29-3. Creating a ramdisk
30-1. A buggy script
30-2. Missing keyword
30-3. test24, another buggy script
30-4. Testing a condition with an "assert"
30-5. Trapping at exit
30-6. Cleaning up after Control-C
30-7. Tracing a variable
32-1. Subshell Pitfalls
32-2. Piping the output of echo to a read
34-1. shell wrapper
34-2. A slightly more complex shell wrapper
34-3. A shell wrapper around an awk script
34-4. Perl embedded in a Bash script
34-5. Bash and Perl scripts combined
34-6. A (useless) script that recursively calls itself
34-7. A (useful) script that recursively calls itself
34-8. A "colorized" address database
34-9. Echoing colored text
34-10. Return value trickery
34-11. Even more return value trickery
34-12. Passing and returning arrays
34-13. Fun with anagrams
35-1. String expansion
35-2. Indirect variable references - the new way
35-3. Simple database application, using indirect variable referencing
35-4. Using arrays and other miscellaneous trickery to deal four random hands from a deck of cards
A-1. manview: Viewing formatted manpages
A-2. mailformat: Formatting an e-mail message
A-3. rn: A simple-minded file rename utility
A-4. blank-rename: renames filenames containing blanks
A-5. encryptedpw: Uploading to an ftp site, using a locally encrypted password
A-6. copy-cd: Copying a data CD
A-7. Collatz series
A-8. days-between: Calculate number of days between two dates
A-9. Make a "dictionary"
A-10. Soundex conversion
A-11. "Game of Life"
A-12. Data file for "Game of Life"
A-13. behead: Removing mail and news message headers
A-14. ftpget: Downloading files via ftp
A-15. password: Generating random 8-character passwords
A-16. fifo: Making daily backups, using named pipes
A-17. Generating prime numbers using the modulo operator
A-18. tree: Displaying a directory tree
A-19. string functions: C-like string functions
A-20. Object-oriented database
G-1. Sample .bashrc file
H-1. VIEWDATA.BAT: DOS Batch File
H-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT