The Bash Guide

A quality-driven guide through the shell's many features.

You are using an outdated browser. Please upgrade your browser or activate Google Chrome Frame to improve your experience.

This guide is an introduction to basic and advanced concepts of the bash shell.

It teaches both newcomers and long-time users the best ways to write safe and robust bash scripts, and how to interact efficiently and speedily with the shell as a command line interface.

Authorship

The primary author and maintainer of this guide is lhunath (Maarten Billemont).

For many years I've worked as a volunteer educator, attempting to assist users with their shell scripting problems. During that time I found that most of them held serious misconceptions about the shell, largely due to the the widespread publishing of naïve advice, poor practices, and often outright misinformation. I also found an acute lack of reliable, clear, and accessible information to improve their knowledge, and so I decided to write this guide.

This guide is open source, licensed under Creative Commons Attribution-ShareAlike 4.0 International License (CC-BY-SA). The source code is available at GitHub. Go there to report issues or fork the guide to contribute changes (big or small). To keep up to date with new chapters or improvements to this guide, you could star the GitHub project.

For advice, comments, suggestions, corrections or recommendations, contact lhunath, file an issue or visit the Libera.chat #bash community on IRC.

This guide has gone through several iterations and is a continuing active work in progress. New chapters are being written and existing chapters are continuously being updated and improved.

In writing this guide, I am sharing my knowledge and expertise with the world freely in the hopes of benefitting you and all others like you. If you've benefitted from the knowledge and experience gained through this guide, consider "giving back" to encourage a society of open access and freedom of information. You can give back by providing feedback on the guide at the GitHub project page, making corrections by hitting the edit buttons on the chapter pages, sharing this guide with any of your friends that have similar interests so that they too may learn as you have, or contributing financially in gratitude for my work, time and effort put into writing and maintaining this guide.

✅ Thanks for your contribution!

Exercises

After introducing new practical concepts, the guide offers a set of exercises to allow you to practice your new knowledge. For a summary of all exercises in this guide, see our exercises index.

Chapters

  1. I'm done Inception beta : What is bash, and where does it live? An introduction to bash, installing and starting it; the terminal, the keyboard and the display; programs, processes and how their flow of information is connected.
  2. I'm done Commands And Arguments beta : How do I give bash instructions? About what a command is, and how to issue them; interactive mode and scripts; command syntax, searching commands and programs by name; arguments and word splitting as well as input and output redirection.
  3. I'm done Variables and Expansions alpha : How do I store and work with data? Bash parameters and variables; environment variables, special parameters and array parameters; expanding parameters, expansion operators, command substitution and process substitution; pathname expansion, tilde expansion and brace expansion.
  4. I'm done Tests And Conditionals draft : Different commands for different data. Exit codes, success and failure, testing files, strings and numbers, handling different conditions, conditional operators and conditional compound commands.
  5. I'm done Loops And Functions todo : Avoid repeating yourself. Iterating commands using for loops, while and until loops, select statements and grouping them in functions.
  6. I'm done Asynchronous Commands todo : Doing work in the background and managing jobs. About jobs, asynchronous commands, job control, process identifiers and signals, process management, inter-process communications.
  7. I'm done Colors And Terminal Commands todo : Advanced control over the terminal display. Terminals and terminal sequences, terminal identifiers, terminfo and terminal capabilities, outputting colors, moving the cursor and querying the terminal's state.
  8. I'm done Customizing The Prompt todo : Changing the look and feel of the interactive shell. Prompting, prompt commands and the DEBUG signal, readline, bind and input modes and hotkeys, programmatic command completion.
  9. I'm done Advanced Topics todo : About syntax sugar, specific use cases and shell tricks.
  10. I'm done Recommendations And Pitfalls todo : How to do things well and how to do things very, very badly.
  11. I'm done Noteworthy External Tools todo : Bash is limited, but augmented by a powerful toolset.