Bash scripts run a disproportionate amount of production infrastructure: deploys, backups, migrations, install scripts. The shell's word-splitting rules, error handling, and quoting are all sources of bugs that a code reviewer who only writes Python or Go will miss.

The recurring shapes: unquoted variables that word-split or glob-expand, `set -e` not catching errors inside `||` chains or pipelines, command substitution stripping trailing newlines, and arithmetic surprises when a variable is empty.

The defenses are well-known: `set -euo pipefail` at the top of every script, double-quote every variable expansion, run `shellcheck` in CI, and use `${VAR:?error}` to fail fast on missing variables. None of them are the language's defaults; you have to opt in.

Common pitfalls

Unquoted variables

`rm $file` splits on spaces and expands globs. `rm "$file"` does not. ShellCheck flags every unquoted expansion.

set -e doesn't catch everything

Pipelines (`a | b`) only fail on the last component without `pipefail`. Functions called in conditions don't trigger `-e`.

Empty variable arithmetic

`x=$VAR; let y=x+1` is a runtime error if `VAR` is unset. `${VAR:-0}` is safer.