Functions in Shell Scripting

In this article, we will be looking at using functions to improve the way we write shell scripts. Functions are a grouping of commands that can be reused based on its pre-defined name. The main benefit of using functions is that the code included in them can be reused easily. This is especially beneficial for code segments that are used regularly.

Let’s look at a simple example of shell scripting with the most popular line of code:

$ echo Hello World
Output:
Hello World

This example is quite straightforward. We use the echo command to print “Hello World” to the console.

Syntax of a Function

Let’s look at the two basic formats of function syntax:

# Defining the function

function function_name
{
	# included commands
}

function_name()
{
	# included commands
}

Like in many other programming languages, we can define a comment in shell scripting as well. Comments begin with a “#” (Hash or Pound sign) these are used to explain the behavior of the related lines of code.

The first line of each of these formats contains the function definition. This includes the name of the function. The rest of the function contains the commands to be executed within parentheses. This forms the basic structure of a function.

Let’s look at our previous example again, but this time, let’s convert it to a function.

# Defining the function

print_hello_world()
{
	echo Hello world
}

# Invoking the function

$ print_hello_world
Output:
Hello world

The first line contains the function definition as “print_hello_world()”. After that, the body of the function is defined with the echo command. After the closing parentheses of the function, we make a function call to the print_hello_world() function, and the resulting output is shown thereafter.

Characteristics of a Function

Let’s look at some advanced characteristics of functions that can be used to enhance the use of shell scripts.

Passing Parameters

Parameters can be passed in when calling a function. These are simply stated after the function call and not defined by type.

If you are familiar with other programming languages, you would know that these parameters need to be defined in the function definition, however with shell scripting, that is not the case. You simply refer to them within the function as follows:

# Defining the function

parameter_test()
{
 	echo "The following parameters were passed in: [email protected]"
	echo “First parameter: $1” 
 	echo “First parameter: $2” 
}

# Invoking the function

parameter_test ABC XYZ
Output:
The following parameters were passed in: ABC XYZ
First parameter: ABC
Second parameter: XYZ

The output of this function has been defined to print out the parameters passed into it. The keyword “[email protected]” refers to the full list of parameters passed in, while “$1” would refer to the first argument and so on.

If a function expects a certain number of parameters and a lesser number is passed, the missing parameters will simply be ignored. An error will not be thrown out as otherwise expected.

# Invoking the function

parameter_test DEF
Output:
The following parameters were passed in: DEF
First parameter: DEF
Second parameter:

Scope of Variables

If you are familiar with any other programming language(s), you would know the specifics regarding scope restrictions in that particular programming language. However, when it comes to shell scripting, there are no such restrictions, and all variables have a global scope. Let’s look at another example.

# Defining the function

scope_test()
{
 	echo "Scope Test function called with arguments: [email protected]"
 	x=2
}

x=1
echo "x is $x"

# Invoking the function

scope_test 1 2 3
echo "x is $x"



Output:
x is 1
Scope Test function called with arguments: 1 2 3
x is 2

We begin the above example by defining the function “scope_test()”. This function prints out a sentence to the console with the parameters that are passed in.

We then change the value of the variable x to 1, print its value, execute our function, and finally print the value of x again. The output is self-explanatory and shows how the value of x can be set from anywhere in the script even though it was created within the function, making its scope global.

Returning values

Another useful characteristic of functions is returning a value after manipulating it or performing a calculation. The same can be done in shell scripting as well.

# Defining the function

return_test()
{
 	echo “Return Test invoked!”
 	return $1 
}

# Invoking the function

return_test 4

# Obtaining the value returned by the last command

ret_val=$?
echo "Return value after manipulation: $ret_val"
Output:
Return value after manipulation: 4

Decision Making and Loops

Decision making is an important part of programming and scripts. Shell scripts provide many flavors of IF / ELSE conditions, CASE statements, and loops. This is another article in itself. So let’s look at some of the most common examples.

# IF / ELSE statement

condition_test()
{
 	if [ "$1" -gt "1" ]; then
 		echo “Value entered is greater than 1!”
 	else
  		echo “Value entered is lesser than 1!”
 	fi
}

condition_test 3
condition_test 1

Output:
Value entered is greater than 1!
Value entered is lesser than 1!

This is an IF / ELSE condition, written in the flavor “if...else...fi statement” of shell scripting. The structure is similar to other programming languages other than for the fact that it doesn’t use parentheses. The “fi” keyword is used to mark the end of the conditional code.


# WHILE loop

loop_test()
{
	a=0

	while [ $a -lt 5 ]
 	do
 		echo $a
 		a=`expr $a + 1`
	done
}

loop_test


Output:
0
1
2
3
4

In this example, we define a basic while loop, with the condition a < 5. So the loop repeats itself 5 times and prints out the above output. Again, here too, this code differs from other programming languages in that it uses the keywords “do” and “done” to define the body.

Reusing Functions

Shell scripting provides two ways to easily reuse functions. The first is to add commonly used functions to the bash profile. The location of this file depends on the Operation System you use as well as how you are accessing the shell, especially on Windows.

The bash profile is loaded every time you log in to the shell. This is a good way to have easy access to commonly used functions.

Another way to reuse functions is to save them to a file. Open a shell script editor, such as vim or nano, and write in the function and commands that are required, and save the file with a .sh extension. You will now be able to execute these functions by typing the filename in the command prompt.

Conclusion

This article only scratches the surface of the use of functions in shell scripting. While there are some restrictions when compared to other programming languages, functions truly supplement the use of plain shell scripts in many ways. Some of these include reuse of code and segregation for clarity.

There is a lot more that can be done with functions, and we hope that we have sparked your curiosity to learn more.