Why care about the shell timeline?
You will read scripts written for sh in 1989 alongside zsh config files written last week. Knowing which shell each tool targets keeps you from copying a piece of bash-only syntax into a strict POSIX script and watching it explode in CI.
1979 — Bourne shell (sh)
Stephen Bourne wrote sh at Bell Labs to replace the original Thompson shell. It defined the syntax that everyone else cloned: pipes, if/then/fi, here-docs, environment variables, $?. When you write #!/bin/sh, you are asking for that minimal Bourne-flavored grammar — no arrays, no [[ ]], no fancy expansion.
1989 — Bourne Again (bash)
bash is the GNU project's free Bourne replacement. It absorbed ideas from Korn shell (ksh) and C shell (csh): history, command-line editing, arrays, [[ ]] conditionals, $(...) substitution. macOS used bash as the default from 10.3 (2003) until 10.15 (2019), but Apple froze the version at 3.2 because later releases switched to GPLv3.
1990 — Z shell (zsh)
Paul Falstad wrote zsh to be "bash plus everything good from the others." Better completion, recursive globbing (**), prompt themes, named directories, modular plugins via Oh-My-Zsh / Prezto / zinit. macOS Catalina (2019) made it the default login shell.
2005 — fish
fish ("friendly interactive shell") rejected POSIX compatibility on purpose. It has the smartest defaults of any shell — autosuggestions, syntax highlighting, sane scripting — but you cannot run a bash script verbatim. fish is for the prompt, not for portable scripts.
The rule of thumb
Use zsh (or fish) for your interactive prompt. Use bash or POSIX sh for scripts you ship to other machines. Never assume a script's interpreter — always set the shebang.