Tech Articles
UNIXAn in-depth exploration of the gentle art of shell scripting. The shell is a command interpreter. More than just the insulating layer between the operating system kernel and the user, it's also a fairly powerful programming language. A shell program, called a script, is an easy-to-use tool for building applications by "gluing" together system calls, tools, utilities, and compiled binaries.
Virtually the entire repertoire of UNIX commands, utilities, and tools is available for invocation by a shell script. If that were not enough, internal shell commands, such as testing and loop constructs, give additional power and flexibility to scripts. Shell scripts lend themselves exceptionally well to administrative system tasks and other routine repetitive jobs not requiring the bells and whistles of a full-blown tightly structured programming language.
Please click on the chapter title to read the tutorial.
Table of Contents
Part 1. Introduction
2. Starting Off With a Sha-Bang
Part 2. Basics
5. Introduction to Variables and Parameters
6. Quoting
7. Tests
8. Operations and Related Topics
Part 3. Beyond the Basics
11. Internal Commands and Builtins
12. External Filters, Programs and Commands
13. System and Administrative Commands
16. I/O Redirection
17. Here Documents
18. Recess Time
Part 4. Advanced Topics
20. Subshells
23. Functions
24. Aliases
25. List Constructs
26. Arrays
27. Files
28. /dev and /proc
30. Debugging
31. Options
32. Gotchas
34. Miscellany
35. Bash, version 2
36. Endnotes
36.1. Author's Note
36.2. About the Author
36.3. Tools Used to Produce This Book
36.4. Credits
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-6. wh, whois domain name lookup
5-7. Using shift
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-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-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. basen