|
Page 1 of 8 Functions in Shell Scripting - Table of Contents
- 1. Complex Functions and Function Complexities
- 2. Local Variables
- 3. Recursion Without 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 in procedure, 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... }  | A function may be "compacted" into a single line. fun () { echo "This is a function"; echo; } # ^ ^ |
In this case, however, a semicolon must follow the final command in the function. fun () { echo "This is a function"; echo } # Error! # ^ |
|
Functions are called, triggered, simply by invoking their names. A function call is equivalent to a command. Example 23-1. Simple functions #!/bin/bash
JUST_A_SECOND=1
funky () { # This is about as simple as functions get. echo "This is a funky function." echo "Now exiting funky function." } # Function declaration must precede call.
fun () { # A somewhat more complex function. i=0 REPEATS=30
echo echo "And now the fun really begins." echo
sleep $JUST_A_SECOND # Hey, wait a second! while [ $i -lt $REPEATS ] do echo "----------FUNCTIONS---------->" echo "<------------ARE-------------" echo "<------------FUN------------>" echo let "i+=1" done }
# Now, call the functions.
funky fun
exit 0 |
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.
declare -f f1 # This doesn't help either. f1 # Still an error message.
# 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 permissible. # 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. # Even a preceding "declare -f f2" wouldn't help.
echo
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. |
|