- •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
Local Variables
|
Advanced Bash-Scripting Guide: |
|
Prev |
Chapter 23. Functions |
Next |
23.2. Local Variables
What makes a variable "local"?
local variables
A variable declared as local is one that is visible only within the block of code in which it appears. It has local "scope". In a function, a local variable has meaning only within that function block.
Example 23-8. Local variable visibility
#!/bin/bash |
|
func () |
|
{ |
|
local loc_var=23 |
# Declared local. |
echo |
|
echo "\"loc_var\" in function = $loc_var" |
|
global_var=999 |
# Not declared local. |
echo "\"global_var\" in function = $global_var"
}
func
# Now, see if local 'a' exists outside function.
echo
echo "\"loc_var\" outside function = $loc_var"
#"loc_var" outside function =
#Nope, $loc_var not visible globally.
echo "\"global_var\" outside function = $global_var"
#"global_var" outside function = 999
#$global_var is visible globally.
echo
exit 0
http://tldp.org/LDP/abs/html/localvar.html (1 of 4) [7/15/2002 6:35:18 PM]
Local Variables
Before a function is called, all variables declared within the function are invisible outside the body of the function, not just those explicitly declared as local.
#!/bin/bash |
|
func () |
|
{ |
|
global_var=37 |
# Visible only within the function block |
|
#+ before the function has been called. |
} |
# END OF FUNCTION |
echo "global_var = $global_var" # global_var =
# Function "func" has not yet been called, #+ so $global_var is not visible here.
func
echo "global_var = $global_var" # global_var = 37
#Has been set by function call.
23.2.1.Local variables make recursion possible.
Local variables permit recursion, [1] but this practice generally involves much computational overhead and is definitely not recommended in a shell script. [2]
Example 23-9. Recursion, using a local variable
#!/bin/bash |
|
# |
factorial |
# |
--------- |
#Does bash permit recursion?
#Well, yes, but...
#You gotta have rocks in your head to try it.
MAX_ARG=5
E_WRONG_ARGS=65
E_RANGE_ERR=66
if [ -z "$1" ] then
echo "Usage: `basename $0` number" exit $E_WRONG_ARGS
fi
if [ "$1" -gt $MAX_ARG ] then
http://tldp.org/LDP/abs/html/localvar.html (2 of 4) [7/15/2002 6:35:18 PM]
Local Variables
echo "Out of range (5 is maximum)."
#Let's get real now.
#If you want greater range than this,
#rewrite it in a real programming language. exit $E_RANGE_ERR
fi
fact ()
{
local number=$1
#Variable "number" must be declared as local,
#otherwise this doesn't work.
if [ "$number" -eq |
0 ] |
|
|
then |
|
|
|
factorial=1 |
# |
Factorial |
of 0 = 1. |
else |
|
|
|
let "decrnum = |
number - 1" |
|
|
fact $decrnum |
# |
Recursive |
function call. |
let "factorial |
= |
$number * |
$?" |
fi |
|
|
|
return $factorial
}
fact $1
echo "Factorial of $1 is $?."
exit 0
See also Example A-16 for an example of recursion in a script. Be aware that recursion is resource-intensive and executes slowly, and is therefore generally not appropriate to use in a script.
Notes
[1]Herbert Mayer defines recursion as "...expressing an algorithm by using a simpler version of that same algorithm..." A recursive function is one that calls itself.
[2]Too many levels of recursion may crash a script with a segfault.
#!/bin/bash
recursive_function ()
{
(( $1 < $2 )) && f $(( $1 + 1 )) $2;
# As long as 1st parameter is less than 2nd, #+ increment 1st and recurse.
}
recursive_function 1 50000 # Recurse 50,000 levels!
#Segfaults, of course.
#Recursion this deep might cause even a C program to segfault,
http://tldp.org/LDP/abs/html/localvar.html (3 of 4) [7/15/2002 6:35:18 PM]
Local Variables
#+ by using up all the memory allotted to the stack.
# Thanks, S.C.
exit 0 # This script will not exit normally.
Prev |
Home |
Next |
Complex Functions and Function |
Up |
Aliases |
Complexities |
|
|
http://tldp.org/LDP/abs/html/localvar.html (4 of 4) [7/15/2002 6:35:18 PM]