Bash Cheatsheet
Basics
Use this Bash reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
Bash Cheatsheet for Software Engineering Practice
Use this Bash reference when you need shell scripting for portfolio projects, deployment scripts, coding take-homes, or technical interview prep. The examples focus on practical command-line patterns you can explain in a software engineer resume or code review: running scripts safely, handling arguments, redirecting output, and debugging with trace modes.
Shebang and Script Invocation
#!/usr/bin/env bash # preferred: uses PATH to find bash #!/bin/bash # absolute path (common but less portable) bash script.sh # run with bash explicitly ./script.sh # run directly (must be +x) chmod +x script.sh # make executable bash -x script.sh # trace execution (debug mode) bash -n script.sh # syntax check only (no execution) bash -e script.sh # exit on first error bash -u script.sh # error on unset variables bash -o pipefail script.sh # propagate pipe errors
Common Options (set)
set -e # exit immediately on error set -u # treat unset variables as errors set -x # print each command before executing set -o pipefail # pipe fails if any command fails set -euo pipefail # common "safe mode" combination set +e # disable exit-on-error set +x # disable trace # In a script header: set -euo pipefail
Special Parameters
| Parameter | Meaning |
|---|---|
$0 | Name of the script |
$1 … $9 | Positional arguments 1–9 |
${10} | Positional argument 10+ (braces required) |
$# | Number of positional arguments |
$@ | All positional arguments (each separately quoted) |
$* | All positional arguments (single word when quoted) |
$? | Exit status of last command |
$$ | PID of current shell |
$! | PID of last background process |
$- | Current shell options |
$_ | Last argument of previous command |
echo "Script: $0, Args: $#" echo "All args: $@" echo "Last exit: $?" echo "PID: $$"
Special Characters and Quoting
'literal string' # single quotes: no expansion at all "double quoted $var" # double quotes: expands variables and $() $'escape sequences' # ANSI-C quoting: \n \t \\ etc. \\ # escape next character echo "Tab:\tNewline:\n" # \t \n NOT interpreted inside "" echo $'Tab:\tNewline:\n' # \t \n ARE interpreted here printf "A\tB\n" # printf always interprets \n \t
Basic I/O Commands
echo "hello" # print to stdout (adds newline) echo -n "no newline" # suppress trailing newline echo -e "line1\nline2" # interpret escape sequences printf "%-10s %d\n" name 42 # formatted output (preferred over echo) printf '%s\n' "$var" # safely print variable read var # read line from stdin into var read -p "Enter: " var # display prompt before reading read -s var # silent (no echo, for passwords) read -t 5 var # timeout after 5 seconds read -a arr # read words into array read -r line # raw: don't interpret backslashes read -d $'\0' var # read until NUL byte exit 0 # exit with success exit 1 # exit with failure exit $? # exit with last command's status
Exit Status and Boolean Operators
true # always exits 0 false # always exits 1 echo $? # print last exit status (0 = success) command && echo "ok" # run echo only if command succeeds command || echo "failed" # run echo only if command fails command && echo "ok" || echo "failed" # if/else one-liner ! command # negate exit status
Command Separators and Grouping
cmd1; cmd2 # run sequentially (ignore exit status) cmd1 && cmd2 # run cmd2 only if cmd1 succeeds cmd1 || cmd2 # run cmd2 only if cmd1 fails cmd1 | cmd2 # pipe stdout of cmd1 to stdin of cmd2 cmd1 |& cmd2 # pipe both stdout and stderr (bash 4+) (cd /tmp && ls) # subshell: changes don't affect parent { cd /tmp; ls; } # current shell: changes DO affect parent # note: space after { and semicolon before }
Background Jobs and Process Control
cmd & # run in background wait # wait for all background jobs wait $! # wait for last background job wait $pid # wait for specific PID jobs # list background jobs fg %1 # bring job 1 to foreground bg %1 # send job 1 to background kill %1 # kill job 1 kill -9 $pid # force kill by PID disown %1 # remove job from job table (won't get HUP) nohup cmd & # run immune to hangup signal
Builtins Overview
: # no-op, always returns 0 . file # source (same as source) source file # execute file in current shell alias ll='ls -la' # create alias unalias ll # remove alias type cmd # show how cmd would be interpreted which cmd # show path of cmd (external) command -v cmd # portable check if cmd exists builtin cd # force use of builtin, not a function help builtin # show help for a builtin
History Expansion
!! # repeat last command !n # repeat command number n !string # repeat last command starting with string !$ # last argument of previous command !^ # first argument of previous command ^old^new # replace old with new in last command history # show command history history 20 # show last 20 commands history -c # clear history Ctrl+R # reverse search history (interactive)
Keyboard Shortcuts (readline)
| Shortcut | Action |
|---|---|
Ctrl+A | Move to beginning of line |
Ctrl+E | Move to end of line |
Ctrl+U | Delete to beginning of line |
Ctrl+K | Delete to end of line |
Ctrl+W | Delete word before cursor |
Alt+F | Move forward one word |
Alt+B | Move backward one word |
Ctrl+L | Clear screen |
Ctrl+R | Reverse history search |
Ctrl+C | Interrupt current command |
Ctrl+Z | Suspend foreground process |
Ctrl+D | EOF / logout |
Tab | Auto-complete |
Comments