keepcalculator

06 Numbers and Powers

Write Bash Script: A Beginner’s Guide

Card No. 06·54695 · Updated · Standard formula, shown below

This article explains what a Bash script is, how to write and run one, and covers the essential syntax, common mistakes, and practical examples. You’ll learn the core concepts needed to create your own scripts for automating tasks on Linux, macOS, and Windows (via WSL).

What Is a Bash Script?

A Bash script is a plain text file containing a series of commands that the Bash shell (Bourne Again SHell) executes line by line. It’s like a small program that automates repetitive tasks, combines existing tools, and handles complex workflows. Scripts are widely used for system administration, software development, and data processing because they are fast to write and don’t require compilation.

Bash is the default shell on most Linux distributions and macOS (though macOS now uses zsh as the default, Bash remains available). On Windows, you can use the Windows Subsystem for Linux (WSL) or Git Bash to run Bash scripts.

How to Write Your First Bash Script

Creating a script is straightforward. Here’s a step-by-step guide:

  1. Create a file with a .sh extension (e.g., myscript.sh) using any text editor like nano, vim, or VS Code.
  2. Add the shebang line as the first line: #!/bin/bash. This tells the system which interpreter to use.
  3. Write your commands below the shebang. For example: echo "Hello, world!"
  4. Save the file.
  5. Make it executable with the command: chmod +x myscript.sh.
  6. Run it by typing ./myscript.sh in the terminal.

If you omit the execute permission, you can still run it with bash myscript.sh.

Essential Bash Syntax and Constructs

Bash scripts support variables, conditionals, loops, and functions. Here are the essentials:

  • Variables: Assign with name="value" (no spaces around =). Access with $name or ${name}.
  • Conditionals: Use if [ condition ]; then ... fi. For example: if [ -f "$file" ]; then echo "File exists"; fi.
  • Loops: for i in {1..5}; do echo $i; done or while read line; do ...; done < file.txt.
  • Functions: Define with myfunc() { ... } and call with myfunc.
  • Command substitution: Capture output with $(command) or backticks.
  • Exit status: Every command returns a status (0 = success, non-zero = error). Check with $?.

These constructs allow you to build logic into your scripts, making them far more powerful than a simple list of commands.

How to Choose What to Script

Not everything needs a script. Good candidates are tasks you repeat often, involve multiple steps, or require logic. Examples:

  • Backing up a directory and compressing it with a timestamp.
  • Batch-renaming files in a folder.
  • Checking system health (disk usage, CPU, memory) and sending alerts.
  • Automating deployment steps for a web app.
  • Parsing log files and extracting errors.

If a task is a one-off, a simple command might be enough. But if you find yourself typing the same sequence of commands repeatedly, it’s time to script it.

Common Mistakes and How to Avoid Them

Even experienced users trip over these pitfalls:

  • Spaces around the equals sign in variable assignment – name = "value" is wrong; it must be name="value".
  • Missing spaces in conditionals – if [ -f "$file" ] requires spaces inside the brackets.
  • Not quoting variables – Always quote "$var" to handle spaces and special characters.
  • Using echo for multi-line output – Prefer printf for more control.
  • Forgetting to make the script executable – You’ll get a “Permission denied” error.
  • Using Windows line endings – If you edit on Windows, convert CRLF to LF with dos2unix or your editor’s settings.

Debugging tip: run your script with bash -x myscript.sh to see each command as it executes.

Bash vs. Other Shells and Languages

Bash is not the only shell, but it’s the most widely used. Other shells include Zsh (default on macOS), Fish, and Ksh. Scripts written for Bash are usually compatible with Zsh, but not always with Fish, which uses different syntax.

When compared to general-purpose languages like Python, Bash is faster to write for simple file and process tasks, but it’s less robust for complex data structures and error handling. Python is often better for scripts that need to handle JSON, perform complex math, or run on multiple platforms without a Unix-like environment. However, Bash is still the go-to for system administration because it’s always present and excels at gluing together Unix utilities.

Safety and Best Practices

Scripts can be dangerous if they contain errors. Follow these practices to keep your system safe:

  • Use set -e at the top to exit on any error, set -u to fail on undefined variables, and set -o pipefail to catch errors in pipelines.
  • Test on a copy of your data before running a script that deletes or modifies files.
  • Avoid running as root unless absolutely necessary. Use sudo only for specific commands.
  • Validate input – if your script accepts arguments, check they exist and are formatted correctly.
  • Be careful with rm -rf – always double-check the path, and consider using rm -i for interactive confirmation.
  • Use absolute paths or set cd to a known directory at the start to avoid running in unexpected locations.

These habits prevent common accidents and make your scripts more reliable.

Frequently Asked Questions

How do I run a Bash script on Windows?

You can install WSL (Windows Subsystem for Linux) and run Bash scripts in that environment. Alternatively, Git Bash, which comes with Git for Windows, provides a Bash emulation. In both cases, the commands are the same as on Linux.

What is the difference between bash script.sh and ./script.sh?

Running bash script.sh explicitly invokes the Bash interpreter, so the script doesn’t need the executable permission. Running ./script.sh requires the executable permission and uses the shebang line to determine the interpreter. The latter is the standard way to run a script as a program.

Can I write a Bash script on macOS?

Yes. macOS includes Bash (version 3.2 for licensing reasons), but you can install a newer version via Homebrew. The syntax is identical, though some macOS-specific commands may differ from Linux.

How do I pass arguments to a Bash script?

Arguments are available as $1, $2, etc. $0 is the script name, and $# is the number of arguments. Use "$@" to refer to all arguments as a list. For example, ./myscript.sh arg1 arg2 gives $1 = arg1, $2 = arg2.

What does chmod +x do?

It adds the execute permission for the file owner, group, and others. This is required to run the script directly with ./script.sh. Without it, you’ll get a permission denied error.

How can I debug a Bash script?

Use bash -x script.sh to print each command before executing it. You can also add set -x inside the script to turn on debugging for a section. Additionally, check the exit status of commands with $? to see where failures occur.

Related

Method: the standard formula for this calculation, rounded as each result states. See how the calculators work or report an error.

More cards in this drawer

The whole Numbers and Powers drawer →