Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting | ||
---|---|---|
Prev | Chapter 23. Functions | Next |
What makes a variable "local"?
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 |
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.
|
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 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-14 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.
[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.
|