How to Create and Use Bash Scripts

Bash scripting is an extremely useful and powerful part of system administration and development. It might seem extremely scary the first time you do it, but hopefully this guide will help ease the fear.

Bash is a Unix shell, which is a command line interface (CLI) for interacting with an operating system (OS). Any command that you can run from the command line can be used in a bash script. Scripts are used to run a series of commands.

Bash is available by default on Linux and macOS operating systems.

This is not meant to be an extensive guide to bash scripting, but just a straightforward guide to getting started with making your first script, and learning some basic bash syntax.

Prerequisites

A basic command line knowledge is required. Everything you need to know to get started can be found in my How to Use the Command Line article.

This guide is for macOS. I'll be using /Users/tania for all examples, but it will be /Users/your_username for you.

Goals

In this tutorial, we're going to:

Create a bash script that can be run from any directory on the computer.

Learn about variables, conditions, looping, and user input with bash.

Create a simple Git deployment script.

1. Create a bin directory

The first step is to create a bin directory. bin is the standard naming convention of a subdirectory that contains executable programs.

You can make sure you're in the main user directory by navigating to ~ (which is a shortcut for current user home directory, or /Users/tania). This will also be the default directory Terminal always opens in. Typing pwd will confirm the location, as well.

Create bin in that folder, or wherever you want your bash scripts to live.

cd ~ # this takes us to /Users/taniamkdir bin # this creates /Users/tania/bin

2. Export your bin directory to the PATH

Open .bash_profile, which will be located at /Users/tania/.bash_profile, and add this line to the file. If .bash_profile doesn't exist, create it.

export PATH=$PATH:/Users/tania/bin

If you don't see hidden files and directories, or those that begin with a ., press Command + SHIFT + ..
If Terminal.app is open, quit and reopen it so the PATH gets updated.

3. Create a script file and make it executable

Go to your bin folder located in /Users/tania.

cd bin

Create a file called hello-world (no extension) in this folder.

touch hello-world

Open the file in your text editor of choice and type the following.

hello-world

#!/bin/bash

A bash script must always begin with #!/bin/bash to signify that the script should run with bash as opposed to any other shell. This is called a "shebang". You can confirm where the bash interpreter is located with which bash.

whichbash
/bin/bash

As is tradition, we'll make a "Hello, World!" example to get this working.

hello-world

#!/bin/bashecho Hello, World!

Now, you can try to run the file in the terminal.

hello-world

But it won't work.

-bash: hello-world: command not found

We have to make it an executable file by changing the permissions.

chmod u+x hello-world

Now when you run the command, it will output the contents of the echo.

tania@computer:~$ hello-world
Hello, World!

Congrats, you just got your first bash script up and running. You can also run this script from anywhere on the computer, not just in the bin directory.

Strings do not need to use single or double quotes by default. However, single and double quoted strings work as well. A single quoted string will not interpolate variables, but a double quoted string will.

Variables

A variable is declared without a $, but has a $ when invoked. Let's edit our hello-world example to use a variable for the entity being greeted, which is World.

hello-world

#!/bin/bash
who="World"echo Hello, $who!

tania@computer:~$ hello-world
Hello, World!

Note that who = "World" is not valid - there must not be a space between variable and value.

Reading

We declared a variable in the last example, but we can also have the user set the value of a variable dynamically. For example, instead of just having the script say Hello, World!, we can make it ask for the name of the person calling the script, then output that name. We'll do this using the read command.

hello-world

#!/bin/bashecho Who are you?
readwhoecho Hello, $who!

tania@computer:~$ hello-world
Who are you?
Tania
Hello, Tania!

Conditionals

if statements use the if, then, else, and fi keywords. The condition goes in square brackets.

check-id

#!/bin/bashecho How old are you?
read age
if["$age" -gt 20 ]thenecho You can drink.
elseecho You are too young to drink.
fi

tania@computer:~$ check-id
How old are you?
28
You can drink.

Operators are slightly different in bash than what you might be used to.

Bash Operator

Operator

Description

-eq

==

Equal

-ne

!=

Not equal

-gt

>

Greater than

-ge

>=

Greater than or equal

-lt

<

Less than

-le

<=

Less than or equal

-z

== null

Is null

Looping

Bash uses for, while, and until loops. In this example, I'll use the for...in loop to get all the files in a directory and list them.

Git Deploy Example Script

As I mentioned previously, a bash script can use any commands you can use on the command line. An example of a script you might make for yourself is the one below, where the user is prompted for a git commit message and the process of adding, committing, and pushing to origin is all done with a single git-deploy command.

Conclusion

I hope this article has been helpful for you to get started with bash scripting. The concept of having a script that has complete access to anything on my computer was initially a frightening thought for me, but once I got accustomed to it I learned how useful and efficient it can be.

Join the newsletter

I write about JavaScript, programming, and front-end design. Join over 6,000 other developers in keeping up with my content. Unsubscribe whenever. Never any spam, ads, or affiliate links.

I'm Tania, a full-stack software developer specializing in modern JavaScript. I make
open source coding projects and write free, quality articles and tutorials that help
thousands of people daily. No ads, no sponsored posts, no bullshit.