Oct 12, 2023 5 min read

How to Use the Bash Functions

Use bash functions with our step-by-step tutorial. Bash functions can be very helpful while writing your shell scripts.

Use the Bash Functions
Table of Contents

Introduction

Before we start talking on how to use the bash functions, let's briefly understand - What is a Bash Function?

Bash functions provide a way to group and reuse code, making scripts more modular and maintainable. They can be very helpful while writing your shell scripts.

A function is a set of commands that can be called multiple times. It makes the bash script more readable and helps in avoiding the repeated code.

In this tutorial, you will use Bash functions within your shell scripts. We will also address few FAQs related to the Bash function.

Defining Bash Functions

There are two ways in which a bash function can be declared:

The first format starts with the function name, along with parentheses. This is the preferable format:

function_name () {
  commands
}

The single-line version:

function_name () { commands; }

The second format starts with the reserved word function along with the function name:

function function_name {
  commands
}

The single-line version:

function function_name { commands; }

Few points to keep in mind:

  • The commands between the curly braces ({}) are known as the body of the function. The curly braces need to get separated from the body by spaces or newlines.
  • A function doesn't get executed by just defining it. You need to use the function name to invoke it. Commands will automatically get executed when a function is called in the shell script.
  • The function should be defined before any calls to the function.
  • While using single line “compacted” functions, add a semicolon ; to last command in the function.
  • Keep the function names descriptive.

Below is an example:

#!/bin/bash

hello_world () {
   echo 'hello, world'
}

hello_world

This is the analysis of the above code:

  • In line -3, you are defining the function by its name. The curly-brace { marks the start of the function’s body.
  • The line -4 is the function body. The function body can contain multiple commands, statements, and variable declarations.
  • Line -5, the closing curly bracket }is there. It defines the end of the hello_world function.
  • In line -7 you are executing the function. You can execute the function as many times as you want.
  • After, running the script, it will print hello, world.

The Variables Scope

Global variables can be accessed from anywhere in the script. They don't depend on the scope. In bash, all variables are called global even if they are declared in the function.

Local variables are declared within the function body with the local keyword and are useful only inside that function. Moreover, you can have local variables with similar names in different functions.

To have clarity on variables scope working in Bash. Look at the below example:

                                 
#!/bin/bash

var1='A'
var2='B'

my_function () {
  local var1='C'
  var2='D'
  echo "Inside function: var1: $var1, var2: $var2"
}

echo "Before executing function: var1: $var1, var2: $var2"

my_function

echo "After executing function: var1: $var1, var2: $var2"

The script will start by defining 2 global variables. The variables are both var1 and var2. Then there is a function that sets a local variable var1. Further, modifies the global variable var2. After running the script, you will see the below output:

Output

Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D

From the above output, you can conclude that:

  • When a local variable is set inside the function body with the same name as an existing global variable, it will have precedence over the global variable.
  • The Global variables can be changed from within the function.

Returning the Values

Unlike functions in the real programming languages, the Bash functions do not allow the user to return a value when required. After its execution, it returns the value as the status of the last statement which is executed in the function. You will get 0 as status code for success and non-zero decimal number in the 1-255 range if it fails.

The return status is usually specified by using return keyword. It is further assigned to a variable $?. Here, the return statement terminates the function. Think of it as the function’s exit status:

~/return_values.sh
#!/bin/bash

my_function () {
  echo "some result"
  return 55
}

my_function
echo $?
Output

some result
55

To return an arbitrary value from a function, you will need to use other methods as well. The simple option is assigning the result of the function to a global variable:


#!/bin/bash

my_function () {
  func_result="some result"
}

my_function
echo $func_result
Output

some result

Another option is to return a value from a function is to send the value to stdout. Do it using echo or printf like below:


#!/bin/bash

my_function () {
  local func_result="some result"
  echo "$func_result"
}

func_result="$(my_function)"
echo $func_result
Output

some result

Instead of just executing the function printing message to stdout, you are assigning the function output to func_result variable. Do it using the $() command substitution. The variable can be used later as per your need.

Passing Arguments to Bash Functions

To pass any number of arguments to the bash function, simply put them right after the function’s name. They should be separated by a space. It is a good practice to double-quote the arguments to avoid misparsing an argument with spaces in it.

  • The passed parameters are $1, $2, $3$n. These are corresponding to the position of the parameter after the function’s name.
  • Also, the $0 variable is reserved for the function’s name.
  • The $# variable holds the number of positional parameters/arguments passed to the function.
  • Both $* and $@ variables hold all positional parameters/arguments passed to the function.
  • When double-quoted, the "$*" expands to a single string. It is separated by space- "$1 $2 $n".
  • After double-quoting, here the"$@" expands to separate strings- "$1" "$2" "$n".
  • When not double-quoted, both $* and $@ are the same.

Below is an example:


#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"
Output

Hello Joe

FAQ's on how to use the bash functions

How do I define a bash function? 

To define a bash function, use the following syntax:function_name() { commands; }.

Can a bash function have parameters? 

Yes, bash functions can have parameters. You can access these parameters within the function using the special variables $1, $2, and so on.

How do I call a bash function? 

To call a bash function, simply use its name followed by parentheses: function_name.

How do I pass arguments to a bash function?

Arguments can be passed to a bash function by listing them in the function call, separated by spaces: function_name arg1 arg2.

Can I nest bash functions? 

Yes, you can nest bash functions inside other functions. This allows for structuring complex scripts and reusing code.

Can I define bash functions in a separate file and include them in my script? 

Yes, you can define bash functions in a separate file and include them in your script using the source or . command.

Can I use loops in a bash function?

 Yes, you can use loop structures like for, while, and until within a bash function to iterate over lists or perform repetitive tasks.

Conclusion

We hope this detailed guide helped you to use the Bash Functions.

If you have any queries, please leave a comment below, and we’ll be happy to respond to them for sure.

Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to DevOps Blog - VegaStack.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.