Programming Languages

Basic Rules for Bash Scripts

Bash scripts must start with the line #!/bin/bash.

 

This line, the so-called shebang or hashbang, specifies by which interpreter the following code is executed—for example, by bash.

 

Shell scripts can only be executed if the access bits for read access (r) and execution (x) are set. The r bit is set by default for new files anyway, but you have to take care of the x bit (for execute) yourself once:

 

user$ chmod +x myscript

 

If you write a collection of your own shell script programs for daily use, it makes sense to store them in a central location.

 

The best directory to use is ~/bin. If you then make the following change in .profile, these script programs can be run without a full path specification (in some distributions this is not necessary at all, because there ~/bin is always part of PATH):

 

# addition in ~/.profile resp. in ~/.bashrc

PATH=$PATH':~/bin'

 

exit terminates the running script, and thus the script returns the return value of the last executed command. If you don’t want this, you can explicitly pass a value to exit. The value 0 signals an error-free end to the program, 1 indicates a general error, and 2 indicates an error in the passed parameters. All other error codes are application-specific.

 

In most programming languages, the following holds true: as soon as an unhandled error occurs, the program terminates. Things are much more relaxed in bash scripts: the fact that errors occur during command execution—that is, that a command ends with an error code not equal to 0—is accepted as an everyday occurrence. The execution of the script simply continues with the next statement.

 

Obvious syntax errors represent an exception—for example, for a for loop without done or for a character string that begins with " but where the second " character is missing. In such cases, bash can no longer decode the remaining program structure: it displays an error message and aborts the code execution.

 

Even though the high error tolerance of bash is often convenient, sometimes you do want a script to abort at the first error and not produce possible subsequent errors. You can achieve this by including set -e in the code. From this position on, errors lead to the immediate end. If you want this strict error control to apply to the entire script, you need to specify the -e option right in the first line:

 

#!/bin/bash -e

# this script will abort at the first error

...

 

For linked commands, set -e or the bash option -e apply only to the overall result. If cmd1 fails in the following example—even if it is because the command does not exist—then cmd2 will be executed. Only if this command also leads to an error will the script abort:

 

#!/bin/bash -e

cmd1 || cmd2

 

Editor’s note: This post has been adapted from a section of the book Linux: The Comprehensive Guide by Michael Kofler.

Recommendation

Linux: The Comprehensive Guide
Linux: The Comprehensive Guide

Beginner or expert, professional or hobbyist, this is the Linux guide you need! Install Linux and walk through the basics: working in the terminal, handling files and directories, using Bash, and more. Then get into the nitty-gritty details of configuring your system and server, from compiling kernel modules to using tools like Apache, Postfix, and Samba. With information on backups, firewalls, virtualization, and more, you’ll learn everything there is to know about Linux!

Learn More
Rheinwerk Computing
by Rheinwerk Computing

Rheinwerk Computing is an imprint of Rheinwerk Publishing and publishes books by leading experts in the fields of programming, administration, security, analytics, and more.

Comments