Defining Functions

Problem

There are several places in your shell script where you would like to give the user a usage message (a message describing the proper syntax for the command), but you don’t want to keep repeating the code for the same echo statement. Isn’t there a way to do this just once and have several references to it? If you could make the usage message its own script, then you could just invoke it anywhere in your original script—but that requires two scripts, not one. Besides, it seems odd to have the message for how to use one script be the output of a different script. Isn’t there a better way to do this?

Solution

You need a bash function. At the beginning of your script put something like this:

function usage ()
{
printf "usage: %s [ -a | - b ] file1 ... filen\n" $0 > &2
}

Then later in your script you can write code like this:

if [ $# -lt 1]
then
usage
fi

Discussion

Functions may be defined in several ways ([ function ] name () compound-command [ redirections ]). We could write a function definition any of these ways:

function usage ()
{
printf "usage: %s [ -a | - b ] file1 ... filen\n" $0 > &2
}


function usage {
printf "usage: %s [ -a | - b ] file1 ... filen\n" $0 > &2
}


usage ( )
{
printf "usage: %s [ -a | - b ] file1 ... filen\n" $0 > &2
}


usage ( ) {
printf "usage: %s [ -a | - b ] file1 ... filen\n" $0 > &2
}

Either the reserved word function or the trailing () must be present. If function is used, the () are optional. We like using the word function because it is ...

Get bash Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.