Globbing & expansions
Wildcards for filenames, brace expansion for lists, parameter expansion for string ops. The shell rewrites your command line before running it.
Expansion order (POSIX + Bash): (1) brace expansion — textual, filesystem-independent; (2) tilde expansion; (3) parameter & variable expansion; (4) command substitution $(...) and arithmetic $(( )); (5) word splitting on $IFS (only unquoted results); (6) pathname expansion (globbing); (7) quote removal. Understanding this explains why var='a b'; echo $var becomes echo a b (split in step 5), and why glob chars inside variables DO expand (step 6 sees the already-expanded value).
Globstar ** (shopt -s globstar, Bash 4+): matches any number of directories recursively. **/*.js finds all JS files in every subdirectory. Off by default; enable in scripts that rely on it. Zsh has it by default.
Extended globs (shopt -s extglob): adds ?(pat) (0 or 1), *(pat) (0+), +(pat) (1+), @(pat) (exactly 1), !(pat) (not). Example: rm !(*.log) removes everything except .log files. Powerful, but less portable.
nullglob and failglob: by default, a glob that matches nothing stays literal (ls *.missing → error). shopt -s nullglob makes it expand to empty. shopt -s failglob makes it abort. In loops: for f in *.log without nullglob processes the literal string *.log when no files match — a subtle bug.
Parameter expansion full reference: ${var:-x} (default if unset/empty), ${var:=x} (also assign), ${var:+x} (x if set), ${var:?msg} (abort), ${#var} (length), ${var:offset:len} (substring), ${var#pat}/${var##pat} (remove shortest/longest prefix), ${var%pat}/${var%%pat} (remove suffix), ${var/pat/repl}/${var//pat/repl} (replace first/all), ${var,,}/${var^^} (lower/upper, Bash 4+), ${!var} (indirect expansion — value of the variable whose name is in var).
Command substitution nuances: $(cmd) strips trailing newlines — common in var=$(cat file); echo "[$var]" (no double newline). Exit code of $(cmd) is available in $? AFTER the assignment (not during). Nested substitutions are trivial: $(cmd1 $(cmd2)). Backticks do not nest cleanly.
Grounded on https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions
Next up
Text processing — grep, sed, awk, cut, sort, uniq
The Unix data-wrangling toolkit. Compose these with pipes and you solve 90% of log/CSV/text tasks without writing a real program.