alt
Advertisement
Sponsored links
Online Training
Career Series
Exforsys
Exforsys arrow Tech Articles arrow UNIX arrow Advanced Bash-Scripting Guide with Sample Code
Site Search


Advanced Bash-Scripting Guide with Sample Code

An 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

1. Why Shell Programming?

2. Starting Off With a Sha-Bang

Part 2. Basics

3. Exit and Exit Status

4. Special Characters

5. Introduction to Variables and Parameters

6. Quoting

7. Tests

8. Operations and Related Topics

Part 3. Beyond the Basics

9. Variables Revisited

10. Loops and Branches

11. Internal Commands and Builtins

12. External Filters, Programs and Commands

13. System and Administrative Commands

14. Command Substitution

15. Arithmetic Expansion

16. I/O Redirection

17. Here Documents

18. Recess Time

Part 4. Advanced Topics

19. Regular Expressions

20. Subshells

21. Restricted Shells

22. Process Substitution

23. Functions

24. Aliases

25. List Constructs

26. Arrays

27. Files

28. /dev and /proc

29. Of Zeros and Nulls

30. Debugging

31. Options

32. Gotchas

33. Scripting With Style

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-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