– Photo by Iván Rivero from Pexels

In this article I’ll be discussing about linux bash scripting (shell scripting) and I will cover every fundamental concept that you need to get started with bash scripting under linux environment.
Bash scripting is a critical skill for every programmer.

First of all you will need a linux machine to execute these scripts.
You can use any of the below techniques to get a linux machine:

  • Install a linux distribution
  • Install WSL
  • Install Cygwin or MSYS
  • Installing git for bash will provide a bash prompt but this prompt is not a complete linux environment

I’ll suggest you to install WSL2 with Ubuntu-2020.04 (same is installed on my machine).

This one article will cover all the basics and some advanced concepts about bash (shell) scripting, so read it completely.

Very Basics

1. Hello World

Every programmer start by writing a program to print ‘Hello World’ on the console.
Create a file named hello.sh and open it with your favourite text editor (notepad, sublime, atom, vscode, nano, vim, etc).
Write the following code into the file and save.

1
 echo "Hello World :)"

Now run the script by using following command

1
$ bash ./hello.sh

This will print

Hello World :)

2. Comments

We can write comments by using # symbol.

1
2
3
# This is a comment and will not be executed
# The below command will print "Hello World" to the console
echo "Hello World"

Hello World

3. What is shebang (#! /bin/bash)

The shebang is used if you run the script directly as an executable file (for example with the command ./script.sh ). In this case it tells the operating system which executable to run. It’s not required and has no effect if you for example write bash ./script.sh or source the script.
We write the below line at the top of every script #!/bin/bash or #!/usr/bin/env bash

Hello World with shebang
1
2
3
#!/usr/bin/env bash
# hello.sh
echo "Hello World :)"

Hello World :)

4. Variables

Creating variables in bash script is as simple as

1
name="Vikash"

NOTE: Remember there is no space around = operator.

Hello World with variables

hello2.sh

1
2
3
#!/usr/bin/env bash
msg="Hello World from a variable"
echo $msg

$ ./hello2.sh

Hello World from a variable

5. Command line arguments

We can pass arguments while executing the script and use them in the script.
A simple example is below.

params.sh

1
2
3
4
5
#!/usr/bin/env bash
name=$1
website=$2
echo "Hello I am $name"
echo "My website is $website"

$ ./params.sh "Vikash" "Villageprogrammer.blogspot.com"

Hello I am Vikash My website is Villageprogrammer

Parameter Name Description
$0 Script name and path
$1 First argument
$2 - $9 Second to ninth argument
${10} - ${…} More than tenth argument

You can execute a standard linux command and store the result in the variable. – params2.sh

1
2
3
4
5
#!/usr/bin/env bash
today=$(date)
directory=$(pwd)
echo "Today is : $today"
echo "Directory : $directory"

$ ./params2.sh

Today is : Thu Feb 18 17:05:56 IST 202 Directory : /mnt/d/Xplore-Training/UNIX/bash-scripting/scripting

Controls

1. If statement

The syntax of if statement is similar to other programming languages like C, C++.
Syntax

1
2
3
4
if [ condition ]
then
	# write your code here
fi

Example:

if.sh

1
2
3
4
5
6
#!/usr/bin/env bash
num=10
if [ $num -lt 20 ]
then
	echo "$num is less than 20"
fi

$ if.sh

10 is less than 20

You can combine parameter and variable logic with if to write complex scripts.

2. if-else

Syntax

1
2
3
4
5
6
if [ condition ]
then
	# write your code here
else
	# write your code here
fi

Example:

if-else.sh

1
2
3
4
5
6
7
8
#!/usr/bin/env bash
num=10
if [ $num -eq 50 ]
then
	echo "$num is equal to 50"
else
	echo "$num is not equal to 50"
fi

$ ./if-else.sh

10 is not equal to 50

3. if-elif-else

Syntax

1
2
3
4
5
6
7
if [ condition ]
then
	# write your code here
elif [ condition ]
then
	# write your code here
fi

Example:

if-elif-else.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/env bash
num=10
if [ $num -eq 20 ]
then
	echo "$num is equal to 20"
elif [ $num -lt 20 ]
then
	echo "$num is less than 20"
else
	echo "$num is greater than 20"
fi

$ ./if-elif-else.sh

10 is less than 20

Looping

Repetition of a code block can be done using while loop and for loop.

1. while loop

Syntax

1
2
3
4
while [ condition ]
do
	# write your code here
done

Example

while.sh

1
2
3
4
5
6
count=1
while [ $count -lt 5 ]
do
	echo $count
	((count++))
done

$ ./while.sh

1 2 3 4 5

2. for loop

We can pass an array of elements from command line and use them in the script by creating an array array=$@ Syntax:

1
2
3
4
for num in $container
do
	echo $num
done

Example:

for.sh

1
2
3
4
5
6
#!/usr/bin/env bash
nums=$@
for num in $nums
do
	echo $num
done

$ ./for.sh 1 2 3

1 2 3

3. break and continue

break-continue.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env bash
# use '@' for entering more than one inputs (simply an array)
# Pass the values from command line arguments
names=$@
# use of break
for name in $names
do
    if [ $name = "Andy" ]
    then
        echo "End found"
        break
    else
        echo "Hello, $name"
    fi
done

echo "for <break> loop terminated"
# use of continue
for name in $names
do
    if [ $name = "Andy" ]
    then
        echo "Skip found"
        continue
    else
        echo "Hello, $name"
    fi
done

echo "for <continue> loop terminated"
exit 0

$ break-continue.sh "Vikas" "Andy" "Mark"

Hello, Vikas End Found for <break> loop terminated Hello, Vikas Skip found Hello, Mark for <continue> loop terminated

Working with environment variables

We can access any of the environment variable from the bash script.

vars.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/env bash
# environment variables

echo "The path is : $PATH"
echo "The terminal is : $TERM"
echo "The editor is : $EDITOR"

# -z checks for empty
if [ -z $EDITOR ]
then
    echo "The Editor variable is empty"
fi
exit 0

$ ./vars.sh

The path is : <very long list of all paths will be printed> The terminal is : xterm-256color The editor is : The Editor variable is empty

Environment variables and their meaning

HOME : user’s home directory PATH : executable binary’s path HOSTNAME : hostname of the machine SHELL : shell that is being used USER : user of this session TERM : type of command line terminal that is being used

write a program to print user’s name, computer name, and home directory
1
echo "$USER@$HOSTNAME in [$HOME]"

vikas@DAVE in [/home/vikas]

Functions in bash

There are two ways to create functions in bash :

1. Function declaration syntax with function keyword

-function1.sh-

1
2
3
4
#!/usr/bin/env bash
function greeting(){
	echo "Hello"
}

2. Function declaration without keyword

-function2.sh-

1
2
3
4
#!/usr/bin/env bash
greeting(){
	echo "Hello"
}

3. Calling the function

To call the function we just need to use the name of the function, we do not use parentheses as we use in other programming languages (e.g. C, C++, Java, Python, etc.).
-function1.sh-

1
2
3
4
5
6
7
#!/usr/bin/env bash
# declare the function
function greeting(){
	echo "Hello"
}
# calling the function
greeting

$ bash ./function1.sh

Hello

4. What about passing parameters ?

It’s a two step process

  1. Access the parameter value To access the parameter use :
    $1: for first parameter,
    $2: for second parameter,
    … ,
    $n: for nth parameter.
    You can either create a local variable and save the value by local variable=$n or directly access the value by $n (n is the parameter number 1, 2, 3, etc).
  2. Pass the parameter value To pass the value write the value after the function name while calling the function (seperate by space). add 2 3

5. Complete example

-function.sh-

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env bash
function add(){
	local num1=$1
	local num2=$2
	sum=`expr $num1 + $num2`
	echo "Sum=$sum"
}

# call the function
add 2 3 # 5
add 4 5 # 9
add -10 30 # 20
# or use command line arguments (uncomment if used)
# add $1 $2

$ bash ./function.sh

5 9 20

Working with prompt message

You can write a message when asking the user for input.
It can be done by using read command.

-user-prompt.sh-

1
2
3
#!/usr/bin/env bash
read "Hey, What's your name ?" name
echo "Hello, $name"

$ bash ./user-prompt.sh

Hey, What’s your name ? Vikash Hello, Vikash

If you want the input to be in the same line use -p..

-user-prompt2.sh-

1
2
3
#!/usr/bin/env bash
read -p "Hey, What's your name ?" name
echo "Hello, $name"

$ bash ./user-prompt2.sh

Hey, What’s your name ? Vikash Hello, Vikash


Now you have enough understanding to get started with bash (shell) scripting. Go ahead an read a book or two on bash scripting and you will be good at it.

Keep Learining, Keep Practicing. :) :)


That’s All. 😅

Thanks for reading. 🙏
If you liked it feel free to share with your dear ones.💗
And tell me what do you think in the comment box.💬

Stay tuned with CS111.

This post was originally posted on Village Programmer