- •Advanced Bash-Scripting Guide
- •Dedication
- •Table of Contents
- •Part 1. Introduction
- •Advanced Bash-Scripting Guide
- •Chapter 2. Starting Off With a Sha-Bang
- •2.1. Invoking the script
- •2.2. Preliminary Exercises
- •Part 2. Basics
- •Chapter 3. Exit and Exit Status
- •Chapter 4. Special Characters
- •Chapter 5. Introduction to Variables and Parameters
- •5.1. Variable Substitution
- •5.2. Variable Assignment
- •5.3. Bash Variables Are Untyped
- •5.4. Special Variable Types
- •Chapter 6. Quoting
- •Chapter 7. Tests
- •7.1. Test Constructs
- •7.2. File test operators
- •7.3. Comparison operators (binary)
- •7.4. Nested if/then Condition Tests
- •7.5. Testing Your Knowledge of Tests
- •8.1. Operators
- •8.2. Numerical Constants
- •Part 3. Beyond the Basics
- •Chapter 9. Variables Revisited
- •9.1. Internal Variables
- •9.2. Manipulating Strings
- •9.3. Parameter Substitution
- •9.4. Typing variables: declare or typeset
- •9.5. Indirect References to Variables
- •9.6. $RANDOM: generate random integer
- •9.7. The Double Parentheses Construct
- •Chapter 10. Loops and Branches
- •10.1. Loops
- •10.2. Nested Loops
- •10.3. Loop Control
- •10.4. Testing and Branching
- •Chapter 11. Internal Commands and Builtins
- •12.1. Basic Commands
- •12.2. Complex Commands
- •12.3. Time / Date Commands
- •12.4. Text Processing Commands
- •12.5. File and Archiving Commands
- •12.6. Communications Commands
- •12.7. Terminal Control Commands
- •12.8. Math Commands
- •12.9. Miscellaneous Commands
- •Chapter 13. System and Administrative Commands
- •Chapter 14. Command Substitution
- •Chapter 15. Arithmetic Expansion
- •Chapter 16. I/O Redirection
- •16.1. Using exec
- •16.2. Redirecting Code Blocks
- •16.3. Applications
- •Chapter 17. Here Documents
- •Chapter 18. Recess Time
- •Part 4. Advanced Topics
- •Chapter 19. Regular Expressions
- •19.1. A Brief Introduction to Regular Expressions
- •19.2. Globbing
- •Chapter 20. Subshells
- •Chapter 21. Restricted Shells
- •Chapter 22. Process Substitution
- •Chapter 23. Functions
- •23.1. Complex Functions and Function Complexities
- •23.2. Local Variables
- •Chapter 24. Aliases
- •Chapter 25. List Constructs
- •Chapter 26. Arrays
- •Chapter 27. Files
- •Chapter 28. /dev and /proc
- •28.2. /proc
- •Chapter 29. Of Zeros and Nulls
- •Chapter 30. Debugging
- •Chapter 31. Options
- •Chapter 32. Gotchas
- •Chapter 33. Scripting With Style
- •Chapter 34. Miscellany
- •34.2. Shell Wrappers
- •34.3. Tests and Comparisons: Alternatives
- •34.4. Optimizations
- •34.5. Assorted Tips
- •34.6. Oddities
- •34.7. Security Issues
- •34.8. Portability Issues
- •34.9. Shell Scripting Under Windows
- •Chapter 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 Tables
- •List of Examples
- •Bibliography
Functions
Advanced Bash-Scripting Guide:
Prev |
Next |
Chapter 23. Functions
Table of Contents
23.1.Complex Functions and Function Complexities
23.2.Local Variables
Like "real" programming languages, Bash has functions, though in a somewhat limited implementation. A function is a subroutine, a code block that implements a set of operations, a "black box" that performs a specified task. Wherever there is repetitive code, when a task repeats with only slight variations, then consider using a function.
function function_name { command...
}
or
function_name () { command...
}
This second form will cheer the hearts of C programmers (and is more portable).
As in C, the function's opening bracket may optionally appear on the second line.
function_name ()
{
command...
}
Functions are called, triggered, simply by invoking their names.
Example 23-1. Simple function
#!/bin/bash
funky ()
{
echo "This is a funky function." echo "Now exiting funky function."
}# Function declaration must precede call.
# Now, call the function.
funky
exit 0
http://tldp.org/LDP/abs/html/functions.html (1 of 3) [7/15/2002 6:34:37 PM]
Functions
The function definition must precede the first call to it. There is no method of "declaring" the function, as, for example, in C.
#f1
#Will give an error message, since function "f1" not yet defined.
#However...
f1 ()
{
echo "Calling function \"f2\" from within function \"f1\"." f2
}
f2 ()
{
echo "Function \"f2\"."
}
f1 # Function "f2" is not actually called until this point,
#although it is referenced before its definition.
#This is permissable.
#Thanks, S.C.
It is even possible to nest a function within another function, although this is not very useful.
f1 ()
{
f2 () # nested
{
echo "Function \"f2\", inside \"f1\"."
}
}
#f2
#Gives an error message.
f1 # Does nothing, since calling "f1" does not automatically call "f2". f2 # Now, it's all right to call "f2",
#since its definition has been made visible by calling "f1".
#Thanks, S.C.
Function declarations can appear in unlikely places, even where a command would otherwise go.
http://tldp.org/LDP/abs/html/functions.html (2 of 3) [7/15/2002 6:34:37 PM]
Functions
ls -l | foo() { echo "foo"; } # Permissable, but useless.
if [ "$USER" = bozo ] then
bozo_greet () # Function definition embedded in an if/then construct.
{
echo "Hello, Bozo."
}
fi |
|
|
|
|
|
bozo_greet |
# Works |
only |
for |
Bozo, and other users get an error. |
|
# Something |
like this might be |
useful in some |
contexts. |
||
NO_EXIT=1 |
# Will enable |
function |
definition |
below. |
|
[[ $NO_EXIT |
-eq 1 ]] && exit() |
{ true; } |
# Function definition in an "and-list". |
#If $NO_EXIT is 1, declares "exit ()".
#This disables the "exit" builtin by aliasing it to "true".
exit # Invokes "exit ()" function, not "exit" builtin.
# Thanks, S.C.
Prev |
Home |
Next |
Process Substitution |
Up |
Complex Functions and Function |
|
|
Complexities |
http://tldp.org/LDP/abs/html/functions.html (3 of 3) [7/15/2002 6:34:37 PM]