≡ Menu

Bash Shell Script Function Examples

How do I create a shell script function using Bash under UNIX / Linux operating systems?

Functions are nothing but small subroutines or subscripts within a Bash shell script. You need touse to break up a complex script into separate tasks. This improves overall script readability and ease of use. However, shell function cannot return value. They return a status code.

Declare Shell Function

All functions must be declared before they can be used. The syntax is:

function name(){
  Commands
}

OR

 
name(){
 Commands
 return $TRUE
}

You can call function by typing its name:

 
name

Example

Create a shell script called file.sh:

#!/bin/bash
# file.sh: a sample shell script to demonstrate the concept of Bash shell functions
# define usage function
usage(){
	echo "Usage: $0 filename"
	exit 1
}
 
# define is_file_exits function 
# $f -> store argument passed to the script
is_file_exits(){
	local f="$1"
	[[ -f "$f" ]] && return 0 || return 1
}
# invoke  usage
# call usage() function if filename not supplied
[[ $# -eq 0 ]] && usage
 
# Invoke is_file_exits
if ( is_file_exits "$1" )
then
 echo "File found"
else
 echo "File not found"
fi
 

Run it as follows:
chmod +x file.sh
./file.sh
./file.sh /etc/resolv.conf

Task: Export functions

You need to use export command:

 
fname(){
  echo "Foo"
}
 
export -f fname

Task: Make readonly functions

You create functions at the top of the script and set the readonly attribute with the readonly command:

 
fname(){
  echo "Foo"
}
 
usage(){
  echo "Usage: $0 foo bar"
  exit 1
}
 
readonly -f usage
readonly -f fname

Task: Local variables functions

Use the local command to create local variables:

#!/bin/bash
# gloabal x and y
x=200
y=100
 
math(){
  # local variable x and y with passed args	
  local x=$1
  local y=$2
  echo $(( $x + $y ))
}
 
echo "x: $x and y: $y"
# call function 
 
echo "Calling math() with x: $x and y: $y"
math 5 10
 
# x and y are not modified by math()
echo "x: $x and y: $y after calling math()"
echo $(( $x + $y ))

Task: Recursion

A recursive function call itself. Recursion is a useful technique for simplifying some complex algorithms, and breaking down complex problems.

 
#!/bin/bash
foo(){
  # do something
  # if not false call foo
  foo
}
 
# call foo
foo

See Recursive function for more details.

Recommend readings:

Tweet itFacebook itGoogle+ itPDF itFound an error/typo on this page?

{ 7 comments… add one }

  • shweta October 26, 2012, 7:34 am
    fun1(){ x=100000;  echo " In fun() x = $x " ; }
    fun2(){ y=200000;  echo " In fun() y = $y " ; }
    x=100 ; y=200
    echo "before calling d fun1() x=$x"
    echo -e $(fun1)
    echo " after calling d fun1() x=$x"
    echo "before calling d fun2() y=$y"
    fun2
    echo " after calling d fun() y=$y"
    

    output :

    before calling d fun1() x=100
    In fun() x = 100000
     after calling d fun1() x=100
    before calling d fun2() y=200
     In fun() y = 200000
     after calling d fun() y=200000
    

    I m a beginner in Shell programing…., anybody can explain me what is the diff. b/w calling a function as $(fun) or fun….., why the value of x is not changed n value of is changed… what is diff. b/w both invocation.

  • unop December 23, 2012, 5:07 am

    @shweta

    $(command) – causes the command to be run in a subshell (child process of the parent) and any changes made in the subshell do not affect the parent execution context. See the section COMMAND EXECUTION ENVIRONMENT in the bash manpage.

    e.g.
    x=1; echo “before x=$x”; echo “$x” | while read x; do echo “during x=$x”; ((x++)); echo “during x=$x”; done; echo “after x=$x”
    before x=1
    during x=1
    during x=2
    after x=1

    x=1; echo “before x=$x”; ( x=2; echo “during x=$x”; ); echo “after x=$x”
    before x=1
    during x=2
    after x=1

  • unop December 23, 2012, 5:09 am

    BTW,

    commands should be defined (as per `help function’) using one of the following syntaxes

    function funcname { … }
    or
    funcname() { … }

    definitely not
    function funcname() { … }

  • Newbie March 3, 2013, 12:19 am

    Hi,

    Thanks sir, this is explicated in detail and simply, you learn me function with bash :)

    Have a good time

  • Jordan May 3, 2013, 2:59 pm

    Thanks!
    So helpfull as usually…

  • Ting July 2, 2013, 1:55 pm

    Can’t functions take in variable? As $1… .

  • Lewis Stevens June 24, 2015, 7:49 pm

    Hello, i seem to be having this issue whenever i try to do bash on centos. I don’t know why as my bash is /bin/bash and ive tried it on many new installs in this code… i used the code from this section: Task: Local variables functions.

    [root@SERVER01 /]# sh install.sh
    :command not found
    `nstall.sh: line 6: syntax error near expected token `{
    `nstall.sh: line 6: `math(){

    Its really annoying.. i always get :command not found with any new lines… and functions always create an error aswell… why is this?

    Thanks
    Lewis

Leave a Comment