26 modules | 500 levels | Beginner → Expert
First contact with bash scripts: echo, variables, quoting rules.
| Level | Title | Concept |
|---|---|---|
| 1 | Your First Script | #!/bin/bash, echo |
| 2 | Print a Message | echo with a string argument |
| 3 | Single vs Double Quotes | quoting differences |
| 4 | Print Multiple Lines | multiple echo statements |
| 5 | Escape Characters | \n, \t with echo -e |
| 6 | printf Basics | printf format strings |
| 7 | printf vs echo | choosing the right output tool |
| 8 | Suppress Newline | echo -n |
| 9 | Print to Stderr | echo >&2 |
| 10 | Comment Your Script | # comments, script header |
| 11 | Script Exit Code | exit 0, exit 1 |
| 12 | Print Environment Variable | $HOME, $USER |
| 13 | Print Current Date | $(date) command substitution |
| 14 | Print Script Name | $0 |
| 15 | Multi-line String | here-string with echo |
| 16 | Colorized Output | ANSI escape codes |
| 17 | Print a Banner | printf with padding |
| 18 | Print Version Info | combining variables in output |
Declaring, assigning, and using variables; string and integer basics.
| Level | Title | Concept |
|---|---|---|
| 19 | Assign a Variable | name=value (no spaces) |
| 20 | Use a Variable | $var and ${var} |
| 21 | Read-Only Variables | readonly |
| 22 | Unset a Variable | unset |
| 23 | Integer Variables | declare -i |
| 24 | Default Values | ${var:-default} |
| 25 | Assign If Unset | ${var:=default} |
| 26 | Error If Unset | ${var:?error} |
| 27 | Variable Indirection | ${!varname} |
| 28 | Local vs Global Scope | local keyword (preview) |
| 29 | Export a Variable | export |
| 30 | Uppercase Variable | ${var^^} |
| 31 | Lowercase Variable | ${var,,} |
| 32 | String Length | ${#var} |
| 33 | Substring Extraction | ${var:offset:length} |
| 34 | Remove Prefix | ${var#pattern} |
| 35 | Remove Suffix | ${var%pattern} |
| 36 | Replace in String | ${var//old/new} |
Accepting positional arguments, reading user input, validating input.
| Level | Title | Concept |
|---|---|---|
| 37 | First Argument | $1 |
| 38 | Multiple Arguments | $1 $2 $3 |
| 39 | Argument Count | $# |
| 40 | All Arguments | $@ vs $* |
| 41 | Shift Arguments | shift |
| 42 | Require an Argument | check $#, exit if missing |
| 43 | Default Argument | ${1:-default} |
| 44 | Read from Stdin | read var |
| 45 | Read with Prompt | read -p "prompt" var |
| 46 | Read Silently | read -s for passwords |
| 47 | Read with Timeout | read -t |
| 48 | Read into Array | read -a arr |
| 49 | Validate Numeric Input | test with regex [[ $var =~ ^[0-9]+$ ]] |
| 50 | Validate Non-Empty | check -z |
| 51 | Read a File Line by Line | while read loop |
| 52 | Read from Pipe | detecting piped input |
| 53 | Handle Quoted Arguments | quoting in "$@" |
| 54 | Named Flags (manual) | parse --flag value with while/case |
| 55 | Getopts Basics | getopts "ab:" opt |
| 56 | Getopts with Required Option | error on missing optarg |
if/elif/else, test expressions, file tests, string and numeric comparisons.
| Level | Title | Concept |
|---|---|---|
| 57 | Simple if Statement | if [ condition ]; then |
| 58 | if-else | binary decision |
| 59 | if-elif-else | multiple branches |
| 60 | Test String Equality | [ "$a" = "$b" ] |
| 61 | Test String Inequality | != |
| 62 | Test Empty String | -z |
| 63 | Test Non-Empty String | -n |
| 64 | Numeric Comparison | -eq -ne -lt -gt -le -ge |
| 65 | Double Bracket Test | [[ ... ]] advantages |
| 66 | Logical AND in Test | && inside [[ ]] |
| 67 | Logical OR in Test | || inside [[ ]] |
| 68 | Negate a Condition | ! |
| 69 | File Exists | -e, -f, -d |
| 70 | File is Readable | -r, -w, -x |
| 71 | File is Not Empty | -s |
| 72 | Compare File Ages | -nt, -ot |
| 73 | Case Statement | case $var in ... esac |
| 74 | Case with Glob Patterns | case pattern matching |
| 75 | Ternary-Style One-Liner | `[[ cond ]] && true |
| 76 | Check Command Exists | command -v |
| 77 | Check OS Type | uname in condition |
| 78 | Nested if Statements | decision trees |
for, while, until, break, continue, loop control patterns.
| Level | Title | Concept |
|---|---|---|
| 79 | for Loop over List | for x in a b c |
| 80 | for Loop over Range | for i in {1..10} |
| 81 | C-Style for Loop | for ((i=0;i<10;i++)) |
| 82 | while Loop | while [ condition ] |
| 83 | until Loop | until [ condition ] |
| 84 | Infinite Loop with Break | while true; do ... break; done |
| 85 | Continue in Loop | skip iteration |
| 86 | Loop over Arguments | for arg in "$@" |
| 87 | Loop over Files | for f in *.txt |
| 88 | Loop over Lines of a File | while IFS= read -r line |
| 89 | Loop with Counter | tracking iterations |
| 90 | Nested Loops | matrix iteration |
| 91 | Loop with Index | C-style with array index |
| 92 | Loop until Input Valid | retry read loop |
| 93 | Accumulate in Loop | summing, concatenating |
| 94 | Loop with Pipe | while read from pipe |
| 95 | Select Menu | select built-in |
| 96 | Retry with Backoff | exponential wait in loop |
| 97 | Loop over Command Output | while IFS= read -r line < <(cmd) |
| 98 | Generate a Sequence | seq in loop |
| 99 | Loop Early Exit Pattern | return/exit from loop |
| 100 | Parallel Loop Jobs | & background + wait |
Defining functions, arguments, return values, local scope, recursion preview.
| Level | Title | Concept |
|---|---|---|
| 101 | Define a Function | function_name() { } |
| 102 | Call a Function | function invocation |
| 103 | Function Arguments | $1 $2 inside function |
| 104 | Return Exit Code | return N |
| 105 | Capture Return Value | $? after call |
| 106 | Return a String | via echo + $() |
| 107 | Local Variables | local var=value |
| 108 | Default Argument in Function | ${1:-default} |
| 109 | Validate Arguments in Function | guard clause pattern |
| 110 | Function Library | source a helper file |
| 111 | Recursive Function | factorial |
| 112 | Recursive Tree Walk | directory traversal |
| 113 | Function as Callback | passing function name |
| 114 | Functions in a Loop | repeated calls |
| 115 | Overriding a Function | redefining a function |
| 116 | Anonymous-Style Function | inline definition |
| 117 | Error-Handling Function | die() pattern |
| 118 | Log Function | log with timestamp |
| 119 | Function with Array Arg | passing arrays via nameref |
| 120 | Function Return Array | returning multiple values |
All the string operations bash offers natively.
| Level | Title | Concept |
|---|---|---|
| 121 | String Length | ${#str} |
| 122 | Substring | ${str:2:5} |
| 123 | Substring from End | negative offset |
| 124 | Strip Shortest Prefix | ${str#pattern} |
| 125 | Strip Longest Prefix | ${str##pattern} |
| 126 | Strip Shortest Suffix | ${str%pattern} |
| 127 | Strip Longest Suffix | ${str%%pattern} |
| 128 | Replace First Match | ${str/old/new} |
| 129 | Replace All Matches | ${str//old/new} |
| 130 | Uppercase All | ${str^^} |
| 131 | Lowercase All | ${str,,} |
| 132 | Capitalize First Letter | ${str^} |
| 133 | Trim Leading Whitespace | parameter expansion trick |
| 134 | Trim Trailing Whitespace | echo + sed or expansion |
| 135 | Trim Both Ends | combined trimming |
| 136 | Split String to Array | IFS split |
| 137 | Join Array to String | IFS=, join trick |
| 138 | Check Prefix | [[ $str == prefix* ]] |
| 139 | Check Suffix | [[ $str == *suffix ]] |
| 140 | Check Substring | [[ $str == *sub* ]] |
| 141 | Regex Match | [[ $str =~ regex ]] |
| 142 | Extract Regex Group | ${BASH_REMATCH[1]} |
Integer arithmetic, arithmetic expansion, and floating point via bc.
| Level | Title | Concept |
|---|---|---|
| 143 | Integer Addition | $(( a + b )) |
| 144 | Subtraction & Multiplication | $(( a * b )) |
| 145 | Division & Modulo | $(( a / b )), $(( a % b )) |
| 146 | Power | $(( base ** exp )) |
| 147 | Increment / Decrement | (( i++ )), (( i-- )) |
| 148 | Compound Assignment | (( i += 5 )) |
| 149 | let Command | let "result = a * b" |
| 150 | Arithmetic Condition | (( a > b )) as if condition |
| 151 | Float Arithmetic with bc | echo "scale=2; 1/3" | bc |
| 152 | Random Number | $RANDOM |
| 153 | Random in Range | $(( RANDOM % N )) |
| 154 | Convert Bases | printf "%x" 255 |
| 155 | Sum a List | loop accumulator |
| 156 | Min and Max | compare in loop |
Indexed arrays, associative arrays, slicing, iteration.
| Level | Title | Concept |
|---|---|---|
| 157 | Declare an Array | arr=(a b c) |
| 158 | Access Element | ${arr[0]} |
| 159 | All Elements | ${arr[@]} |
| 160 | Array Length | ${#arr[@]} |
| 161 | Append to Array | arr+=(new) |
| 162 | Remove Element | unset arr[i] |
| 163 | Slice an Array | ${arr[@]:start:len} |
| 164 | Loop over Array | for item in "${arr[@]}" |
| 165 | Loop with Index | for i in "${!arr[@]}" |
| 166 | Array from Command | mapfile -t arr < <(cmd) |
| 167 | Array from File Lines | mapfile |
| 168 | Search in Array | loop + grep |
| 169 | Sort an Array | readarray + sort |
| 170 | Unique Elements | sort + uniq trick |
| 171 | Associative Array | declare -A map |
| 172 | Add Key-Value | map[key]=value |
| 173 | Iterate Assoc Array | for k in "${!map[@]}" |
| 174 | Check Key Exists | [[ -v map[key] ]] |
| 175 | Delete Key | unset map[key] |
| 176 | Pass Array to Function | nameref declare -n |
| 177 | Return Array from Function | output parsing |
| 178 | 2D Array Simulation | key encoding trick |
stdin/stdout/stderr, file descriptors, here-docs, process substitution.
| Level | Title | Concept |
|---|---|---|
| 179 | Redirect stdout to File | > and >> |
| 180 | Redirect stderr to File | 2> |
| 181 | Redirect Both | &> |
| 182 | Redirect stderr to stdout | 2>&1 |
| 183 | Discard Output | >/dev/null |
| 184 | Read from File with Redirect | cmd < file |
| 185 | Here-Document | <<EOF ... EOF |
| 186 | Here-Document No Expand | <<'EOF' |
| 187 | Here-String | cmd <<< "string" |
| 188 | Pipe Between Commands | cmd1 | cmd2 |
| 189 | Pipeline Exit Code | ${PIPESTATUS[@]} |
| 190 | Process Substitution Input | cmd <(other_cmd) |
| 191 | Process Substitution Output | cmd >(other_cmd) |
| 192 | Tee in Pipeline | tee for logging |
| 193 | Custom File Descriptor | exec 3>file |
| 194 | Close File Descriptor | exec 3>&- |
| 195 | Redirect in Function | function with fd |
| 196 | Log Everything with exec | exec > >(tee logfile) |
exit codes, set -e/u/o pipefail, guard clauses, trap.
| Level | Title | Concept |
|---|---|---|
| 197 | Check Exit Code | $? after command |
| 198 | Exit on Failure | cmd || exit 1 |
| 199 | set -e | abort on error |
| 200 | set -u | abort on unset variable |
| 201 | set -o pipefail | catch pipe failures |
| 202 | Strict Mode Combo | set -euo pipefail |
| 203 | Trap on EXIT | cleanup always runs |
| 204 | Trap on ERR | log which command failed |
| 205 | Trap on SIGINT | graceful Ctrl-C |
| 206 | Trap on SIGTERM | handle kill signal |
| 207 | Cleanup Temp Files | trap + mktemp |
| 208 | die() Function | unified error exit |
| 209 | Guard Clause Pattern | early return on bad input |
| 210 | Retry on Failure | loop with counter |
| 211 | Timeout a Command | timeout command |
| 212 | Check Dependency Exists | command -v guard |
| 213 | Validate File Argument | must exist and be readable |
| 214 | Propagate Exit Codes | maintain exit code through functions |
Pattern matching with
[[ =~ ]], grep, sed, and BASH_REMATCH.
| Level | Title | Concept |
|---|---|---|
| 215 | Basic Regex Match | [[ $str =~ pattern ]] |
| 216 | Capture Group | ${BASH_REMATCH[1]} |
| 217 | Multiple Groups | ${BASH_REMATCH[2]} |
| 218 | Match a Number | ^[0-9]+$ |
| 219 | Match an Email | email regex pattern |
| 220 | Match an IP Address | IP regex pattern |
| 221 | Match a Date | YYYY-MM-DD regex |
| 222 | Anchors | ^ and $ |
| 223 | Character Classes | [a-z], [[:alpha:]] |
| 224 | Quantifiers | *, +, ?, {n,m} |
| 225 | Alternation | (foo|bar) |
| 226 | Non-Greedy in sed | sed 's/a.*?b/X/' (POSIX) |
| 227 | grep -E in Script | extended regex in scripts |
| 228 | grep -P in Script | Perl regex (where available) |
| 229 | sed Substitution in Script | sed 's/old/new/' |
| 230 | sed with Capture Group | sed 's/\(.*\)/[\1]/' |
| 231 | Validate and Extract | combined match + capture |
| 232 | Multi-line Regex Logic | line-by-line state machine |
Creating, reading, writing, copying, and manipulating files from scripts.
| Level | Title | Concept |
|---|---|---|
| 233 | Create a File | touch, > |
| 234 | Write to a File | echo redirect |
| 235 | Append to a File | >> |
| 236 | Read Entire File | $(<file) |
| 237 | Read Line by Line | while IFS= read -r |
| 238 | Read Specific Line | sed -n '5p' |
| 239 | Count Lines in File | wc -l |
| 240 | Copy a File | cp with error check |
| 241 | Move/Rename a File | mv |
| 242 | Delete Safely | check before delete |
| 243 | Create Temp File | mktemp |
| 244 | Create Temp Directory | mktemp -d |
| 245 | Find Files by Pattern | find in script |
| 246 | Find Files by Age | find -mtime |
| 247 | File Locking | flock |
| 248 | Atomic Write | write-then-move pattern |
| 249 | Backup Before Write | cp + write pattern |
| 250 | Parse CSV File | IFS split per line |
Using awk, sed, cut, sort, uniq, tr as script tools.
| Level | Title | Concept |
|---|---|---|
| 251 | Cut Columns | cut -d, -f2 |
| 252 | Sort File | sort in script |
| 253 | Sort Numerically | sort -n |
| 254 | Unique Lines | sort | uniq |
| 255 | Count Occurrences | sort | uniq -c | sort -rn |
| 256 | Translate Characters | tr |
| 257 | Delete Characters | tr -d |
| 258 | Squeeze Whitespace | tr -s ' ' |
| 259 | awk Print Column | awk '{print $2}' |
| 260 | awk with Condition | awk '$3 > 100' |
| 261 | awk Sum Column | awk '{sum+=$1} END{print sum}' |
| 262 | awk Field Separator | awk -F, |
| 263 | awk Associative Array | frequency count |
| 264 | sed Delete Lines | sed '/pattern/d' |
| 265 | sed Print Line Range | sed -n '5,10p' |
| 266 | sed Multi-command | -e |
| 267 | sed In-Place Edit | sed -i |
| 268 | Join Two Files | join, paste |
| 269 | Column Alignment | column -t |
| 270 | Generate a Report | combine awk+sort+head |
| 271 | Parse Key=Value Config | while read + IFS |
| 272 | Transform JSON-like Text | extract values with grep/awk |
Headers, strict mode, documentation, shellcheck habits, portability.
| Level | Title | Concept |
|---|---|---|
| 273 | Proper Shebang | #!/usr/bin/env bash |
| 274 | Script Header Block | name, author, usage, description |
| 275 | Usage Function | print_usage() with exit |
| 276 | Strict Mode Setup | set -euo pipefail + IFS |
| 277 | ShellCheck Clean Script | write shellcheck-clean code |
| 278 | Consistent Quoting | always quote variables |
| 279 | Avoid Word Splitting Bugs | "$@" not $@ |
| 280 | Use Printf over Echo | portable output |
| 281 | Avoid Useless Cat | < file not cat file | |
| 282 | Use Local Variables | prevent global leaks |
| 283 | Use Meaningful Names | naming conventions |
| 284 | DRY with Functions | no copy-pasted logic |
| 285 | Modular Script Layout | organize into sections |
| 286 | Configuration Section | top-of-script constants |
| 287 | Main Function Pattern | main() { }; main "$@" |
| 288 | Portable Bash | avoid bashisms where possible |
| 289 | POSIX sh vs bash | know when you need bash |
| 290 | Version Guard | check bash version |
set -x, PS4, bashdb techniques, tracing, and isolating bugs.
| Level | Title | Concept |
|---|---|---|
| 291 | set -x Trace | set -x |
| 292 | set -v Verbose | set -v |
| 293 | Custom PS4 | show file/line in trace |
| 294 | Trace a Subshell | bash -x script.sh |
| 295 | Trace Specific Block | set -x; ...; set +x |
| 296 | Debug Log Function | conditional DEBUG variable |
| 297 | LINENO in Errors | $LINENO |
| 298 | FUNCNAME Stack | ${FUNCNAME[@]} |
| 299 | BASH_SOURCE | source file tracking |
| 300 | Trap ERR with Context | log command + line |
| 301 | Dry-Run Mode | DRY_RUN=1 flag |
| 302 | Assert Function | assert_eq, assert_true |
| 303 | Test-Driven Bash | write tests for your function |
| 304 | Isolate Failing Command | binary search debug |
Background jobs, wait, signals, subshells, job control from scripts.
| Level | Title | Concept |
|---|---|---|
| 305 | Run in Background | cmd & |
| 306 | Capture Background PID | $! |
| 307 | Wait for Background Job | wait $pid |
| 308 | Wait All Backgrounds | wait |
| 309 | Check Job Still Running | kill -0 $pid |
| 310 | Kill a Background Job | kill $pid |
| 311 | Parallel Jobs with Limit | N workers pattern |
| 312 | Subshell | ( ... ) |
| 313 | Subshell Variable Isolation | changes don't leak |
| 314 | Command Group | { ... } |
| 315 | Process Substitution | <(cmd) |
| 316 | Named Pipe (FIFO) | mkfifo |
| 317 | Send Signal to Self | kill -USR1 $$ |
| 318 | Handle SIGHUP | daemon-style script |
| 319 | nohup & disown | detach from terminal |
| 320 | xargs for Parallelism | xargs -P N |
| 321 | GNU Parallel Basics | parallel tool |
| 322 | Semaphore Pattern | limit concurrent jobs |
Higher-order patterns: dispatch tables, hooks, plugins, memoization.
| Level | Title | Concept |
|---|---|---|
| 323 | Dispatch Table | assoc array of function names |
| 324 | Plugin System | source files from a dir |
| 325 | Hook System | pre/post hook arrays |
| 326 | Memoize a Function | cache results in assoc array |
| 327 | Curry-Style Partial | factory functions |
| 328 | Decorator Pattern | wrap and extend a function |
| 329 | Function Exists Check | declare -F func |
| 330 | Dynamic Function Call | "$func" args |
| 331 | Variadic Functions | "$@" forwarding |
| 332 | Generator Pattern | function + global state |
| 333 | Iterator over File | closure-style read |
| 334 | Event Emitter | signal-driven pattern |
| 335 | Builder Pattern | chained config calls |
| 336 | Strategy Pattern | swap algorithm functions |
| 337 | Middleware Chain | pipeline of functions |
| 338 | Retry Decorator | wrap any command |
| 339 | Timeout Decorator | timeout wrapping |
| 340 | Audit Decorator | log all calls |
Config files, dotenv loading, environment variable management.
| Level | Title | Concept |
|---|---|---|
| 341 | Load dotenv File | parse KEY=VALUE into env |
| 342 | Config File with Defaults | layered config merging |
| 343 | Override via Env Var | ${VAR:-config_value} |
| 344 | Validate Required Config | check all required vars |
| 345 | XDG Base Dirs | $XDG_CONFIG_HOME |
| 346 | Per-User Config | ~/.config/app/config |
| 347 | Per-Project Config | walk up to find config |
| 348 | Config Schema Check | validate types, ranges |
| 349 | Secret Handling | never echo secrets |
| 350 | Masked Output | replace secret in logs |
| 351 | Dynamic Config Reload | trap SIGHUP to reload |
| 352 | Environment Report | print all config values |
| 353 | Config Migration | upgrade old format |
| 354 | Config Diff | compare two config files |
Injection prevention, safe file handling, privilege awareness.
| Level | Title | Concept |
|---|---|---|
| 355 | Quote to Prevent Injection | "$var" vs eval danger |
| 356 | Safe eval Usage | never eval user input |
| 357 | Sanitize User Input | strip dangerous chars |
| 358 | Safe Temp Files | mktemp, not predictable names |
| 359 | Restrict Permissions | umask in scripts |
| 360 | Avoid World-Writable | chmod after create |
| 361 | Check Running as Root | guard non-root scripts |
| 362 | Drop Privileges | sudo -u as target user |
| 363 | Secure PATH | reset PATH at script start |
| 364 | Avoid Parsing ls | use glob/find instead |
| 365 | Safe Directory Traversal | check symlinks |
| 366 | Prevent TOCTOU | atomic operations |
| 367 | Credential Scrubbing | clear vars after use |
| 368 | Log Sanitization | remove secrets from logs |
curl, wget, HTTP checks, API calls, retry logic, webhook scripts.
| Level | Title | Concept |
|---|---|---|
| 369 | HTTP GET with curl | curl -s URL |
| 370 | Check HTTP Status Code | curl -o /dev/null -w "%{http_code}" |
| 371 | POST with curl | curl -X POST -d data |
| 372 | JSON POST | curl -H "Content-Type: application/json" |
| 373 | Pass Auth Header | Bearer token |
| 374 | Handle curl Errors | --fail flag |
| 375 | Retry HTTP Request | loop with backoff |
| 376 | Parse JSON Response | jq in scripts |
| 377 | Extract Field from JSON | jq -r '.field' |
| 378 | Webhook Listener Stub | nc listener |
| 379 | Check Port Open | nc -z host port |
| 380 | DNS Lookup in Script | dig, nslookup |
| 381 | Download File Safely | verify checksum |
| 382 | Rate-Limited API Script | sleep between calls |
Structured logging, log rotation, health checks, alerting scripts.
| Level | Title | Concept |
|---|---|---|
| 383 | Timestamped Log | printf "[%s] %s\n" "$(date)" "$msg" |
| 384 | Log Levels | DEBUG INFO WARN ERROR |
| 385 | Log to File and Stdout | tee |
| 386 | Log Rotation Stub | size check + mv |
| 387 | Syslog from Script | logger command |
| 388 | Health Check Script | check process, disk, memory |
| 389 | Disk Usage Alert | threshold + notification |
| 390 | CPU Load Check | uptime parse |
| 391 | Memory Usage Check | free parse |
| 392 | Process Alive Check | pidfile pattern |
| 393 | Heartbeat Script | periodic ping/log |
| 394 | Alert on Log Pattern | tail + grep + notify |
| 395 | Metrics Collector | gather stats to file |
| 396 | Dashboard Script | terminal status display |
| 397 | Watchdog Script | restart crashed process |
| 398 | On-Call Notification | curl to webhook on alert |
| 399 | Audit Trail | append every action |
| 400 | Summary Report Generator | aggregate daily stats |
Deployment scripts, release management, CI helper scripts.
| Level | Title | Concept |
|---|---|---|
| 401 | Build Script | compile + test + report |
| 402 | Deploy Script | copy + restart + verify |
| 403 | Rollback Script | restore previous version |
| 404 | Health Check After Deploy | poll until healthy |
| 405 | Release Tag Script | git tag + push |
| 406 | Changelog Generator | git log formatting |
| 407 | Version Bumper | semver increment |
| 408 | Dependency Checker | check all tools installed |
| 409 | Lint Script | run linters, collect exit codes |
| 410 | Test Runner Script | run tests, parse output |
| 411 | Coverage Check | fail below threshold |
| 412 | Docker Build Script | build + tag + push |
| 413 | Kubernetes Apply Script | apply + wait + verify |
| 414 | Secret Injection Script | render template with secrets |
| 415 | Environment Promo Script | promote config between envs |
| 416 | Cron Wrapper Script | lock + log + notify |
| 417 | Idempotent Setup Script | check before create |
| 418 | Cleanup Script | remove old artifacts |
CSV, JSON, log parsing, report generation, data transformation.
| Level | Title | Concept |
|---|---|---|
| 419 | Parse CSV | IFS + while read |
| 420 | Validate CSV Schema | check column count |
| 421 | Filter CSV Rows | awk condition |
| 422 | Transform CSV Columns | awk reorder |
| 423 | Aggregate CSV Column | sum/avg/min/max |
| 424 | Join Two CSVs | join on key |
| 425 | Convert CSV to JSON | awk JSON output |
| 426 | Parse Log File | extract fields by regex |
| 427 | Count Log Events | frequency table |
| 428 | Top N from Log | sort + head |
| 429 | Time-Range Filter | compare timestamps |
| 430 | Pivot Table in Bash | assoc array aggregation |
| 431 | Generate HTML Report | heredoc HTML |
| 432 | Generate Markdown Report | dynamic tables |
| 433 | Diff Two Data Sets | comm or diff |
| 434 | Deduplicate Records | sort -u on key |
| 435 | Merge Files by Key | multi-file join |
| 436 | Streaming Transform | process line by line, no temp file |
Real sysadmin-level scripts: backups, user management, system hardening.
| Level | Title | Concept |
|---|---|---|
| 437 | Backup Script | rsync + timestamp + retention |
| 438 | Incremental Backup | rsync --link-dest |
| 439 | Restore Verification | checksum comparison |
| 440 | User Provisioning Script | create users from CSV |
| 441 | User Deprovisioning Script | lock + archive home |
| 442 | SSH Key Distributor | push keys to multiple hosts |
| 443 | Multi-Host Executor | run command on host list |
| 444 | Config Distributor | rsync config to servers |
| 445 | Certificate Expiry Checker | parse openssl output |
| 446 | Log Archiver | compress + move old logs |
| 447 | Disk Cleanup Script | remove old files by age/size |
| 448 | Package Audit Script | list installed, flag outdated |
| 449 | Service Restart Orchestrator | rolling restart |
| 450 | Database Dump Script | dump + compress + verify |
| 451 | Port Scanner Script | nc loop over ports |
| 452 | SSL Checker Script | verify cert chain |
| 453 | Firewall Audit Script | parse iptables output |
| 454 | Hardening Checklist Script | check security settings |
| 455 | Compliance Report Script | gather evidence, write report |
| 456 | Incident Response Script | collect forensic data |
Multi-step, real-world automation challenges. Each mission requires
combining 5+ concepts into a production-quality script.
| Level | Title | Mission Summary |
|---|---|---|
| 457 | The Deployment Pipeline | Build → test → deploy → verify → rollback on failure |
| 458 | The Log Investigator | Parse multi-format logs, extract incidents, generate report |
| 459 | The Secret Rotator | Rotate credentials, update configs, verify services |
| 460 | The Capacity Planner | Collect disk/CPU/mem trends, project growth, alert |
| 461 | The User Auditor | Find orphan users, stale accounts, bad permissions |
| 462 | The API Poller | Poll API, detect state changes, trigger webhooks |
| 463 | The Backup Verifier | Restore + checksum every backup in retention window |
| 464 | The Cron Analyzer | Parse crontabs across users, find conflicts, report |
| 465 | The Config Drift Detector | Compare live config vs golden config, flag diffs |
| 466 | The Release Manager | Tag, changelog, build, upload artifacts, notify |
| 467 | The Certificate Watchdog | Check all certs, alert on expiry, auto-renew stub |
| 468 | The Service Health Dashboard | Multi-service status in terminal, auto-refresh |
| 469 | The Incident Responder | Collect system state snapshot on alert trigger |
| 470 | The Multi-Env Deployer | Deploy to dev/staging/prod with promotion gates |
| 471 | The Data Pipeline | Ingest CSV, validate, transform, load, report |
| 472 | The Test Harness Builder | Framework: register + run + report test cases |
| 473 | The Plugin System | Core + plugin discovery + execution |
| 474 | The CLI Framework | Subcommands, flags, help, version |
| 475 | The Config Manager | Load, validate, merge, export config |
| 476 | The Job Queue | FIFO queue with worker pool |
| 477 | The Audit Logger | Tamper-evident append-only log |
| 478 | The Self-Updating Script | Download + verify + replace self |
| 479 | The Distributed Lock | flock across shared filesystem |
| 480 | The Rate Limiter | Token bucket in bash |
| 481 | The Circuit Breaker | State machine for API calls |
| 482 | The Feature Flag System | Config-driven feature toggling |
| 483 | The Blue-Green Switcher | Atomic traffic switch between deployments |
| 484 | The Canary Releaser | Gradual traffic shift + monitor |
| 485 | The Chaos Monkey | Random fault injection for resilience testing |
| 486 | The SLA Monitor | Track uptime, calculate SLA %, generate report |
| 487 | The Cost Analyzer | Aggregate resource usage, estimate costs |
| 488 | The Security Scanner | Find misconfigs, world-writable files, weak perms |
| 489 | The Forensics Collector | Preserve evidence: processes, connections, files |
| 490 | The Self-Healing Script | Monitor + detect + auto-remediate |
| 491 | The Dependency Graph | Build task DAG, execute in order |
| 492 | The Template Engine | Variable substitution in text templates |
| 493 | The State Machine | Enum states, transitions, validation |
| 494 | The Event Bus | Pub/sub via named pipes |
| 495 | The Retry Framework | Configurable retry with strategies |
| 496 | The Observability Kit | Metrics + logs + traces in bash |
| 497 | The Compliance Enforcer | Apply and verify policy rules |
| 498 | The Migration Runner | Ordered idempotent migration scripts |
| 499 | The Ultimate Deployer | Full GitOps-style deploy pipeline |
| 500 | The Grand Finale | Design and implement a complete sysadmin automation suite |
| Difficulty | Levels | Modules |
|---|---|---|
| Beginner | 160 | 1–5 (levels 1–100) + module 6 partial |
| Intermediate | 175 | Modules 6–13 (levels 101–250) |
| Advanced | 140 | Modules 14–24 (levels 251–436) |
| Expert | 25 | Modules 25–26 (levels 437–500) |
| Total | 500 | 26 modules |