Bash cheat sheet

Notes I wrote reading the bash wiki

Bash Behavior & Syntax Cheat Sheet

Argument Parsing & Quoting

1. Quoted arguments are passed as a single argument

echo "hello world"   # one argument: "hello world"
echo hello world     # two arguments: "hello" and "world"

2. Single quotes prevent all expansions

echo '$HOME'   # prints: $HOME
echo "$HOME"   # expands to: /home/user

3. Always quote variable expansions ("$var")

Prevents word splitting + glob expansion.

name="a b * c"
echo $name     # BAD: splits; globs expand
echo "$name"   # GOOD: literal content

Tests: [ vs [[

4. [ is a builtin (POSIX test), [[ is a Bash keyword

[ "$x" = "abc" ]      # POSIX test
[[ $x == abc ]]       # Bash test, supports patterns, safer

5. [[ uses pattern matching unless the right side is quoted

x="hello"

[[ $x = h* ]]     # true (pattern match)
[[ $x = "h*" ]]   # false (literal match)

Globbing

6. Bash filename expansion uses globs, not regular expressions

❌ Not valid:

ls *.txt$

✔ Correct:

echo *.txt

7. Extended globs (+( ), !( ), etc.) require enabling

shopt -s extglob
echo +([0-9]).log

8. Globs can expand even when partially quoted

echo "*.txt"    # no expansion → prints "*.txt"
echo *".txt"    # expands → file1.txt file2.txt

Grouping & Control Flow

9. Group commands with {} when using && / ||

{ echo one; echo two; } && echo "group succeeded"

10. Grouping allows redirecting multiple commands at once

Redirect output:

{
    echo line1
    echo line2
} > out.txt

Redirect input:

{
    read a
    read b
    echo "$a and $b"
} < file.txt

Pipelines & Subshells

11. Pipe (|) connects stdout → stdin

echo "hello" | tr a-z A-Z

12. Each side of a pipe runs in a subshell

x=1
echo hi | { read l; x=2; }
echo "$x"     # still 1

13. Parentheses ( ) also create a subshell

x=1
( x=2 )
echo "$x"   # prints 1

14. Braces { } do NOT create a subshell

x=1
{ x=2; }
echo "$x"   # prints 2

Sourcing

15. source or . runs a script in the current shell

script.sh:

x=42

Using source:

x=1
source script.sh
echo "$x"   # prints 42

Executing script directly:

x=1
./script.sh
echo "$x"   # prints 1 (runs in subshell)

Dot form:

. script.sh

Leave a Reply