рдореБрдЦреНрдп рдордЬрдХреБрд░рд╛рдХрдбреЗ рдЬрд╛
JobCannon
рд╕рд░реНрд╡ рдХреМрд╢рд▓реНрдпреЗ

Shell Scripting

Automate everything with Bash, Zsh, and command-line tools

тмв рд╢реНрд░реЗрдгреА 2рддрд╛рдВрддреНрд░рд┐рдХ
рдордзреНрдпрдо
рдкрдЧрд╛рд░рд╛рд╡рд░реАрд▓ рдкрд░рд┐рдгрд╛рдо
2 рдорд╣рд┐рдиреЗ
рд╢рд┐рдХрдгреНрдпрд╛рд╕ рд▓рд╛рдЧрдгрд╛рд░рд╛ рд╡реЗрд│
рдордзреНрдпрдо
рдХрд╛рдард┐рдгреНрдп
1
рдХрд░рд┐рдЕрд░реНрд╕
рдПрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреНрд╖реЗрдкрд╛рдд

Shell scripting (Bash, Zsh, POSIX sh) automates deployment, configuration, and operational tasks across Unix/Linux systems. Supplementary skill that unlocks senior DevOps and SRE roles: junior uses scripts for basic automation (+$10-15k), mid-level orchestrates complex pipelines with sed/awk/jq (+$15-20k), senior tunes performance and writes portable frameworks (+$20-25k). Prerequisite for backend/DevOps tier advancement. Time investment: 1-3 months for proficiency. Tools: bash, zsh, sed, awk, grep, find, xargs, jq, ShellCheck. Not a primary career path (unlike programming languages), but mandatory foundation.

Shell Scripting рдореНрд╣рдгрдЬреЗ рдХрд╛рдп

  • Shell scripts being replaced by Python for complex logic - ShellCheck and shfmt standardizing script quality

ЁЯФз рд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рдкрд░рд┐рд╕рдВрд╕реНрдерд╛
bashzshPOSIX shsedawkgrepfindxargsjqShellCheckfishcurl

ЁЯУЛ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА

ЁЯТ░ рдкреНрд░рджреЗрд╢рд╛рдиреБрд╕рд╛рд░ рдкрдЧрд╛рд░

рдкреНрд░рджреЗрд╢рдЬреНрдпреБрдирд┐рдпрд░рдордзреНрдпрдорд╕реАрдирд┐рдпрд░
USA$85k$115k$160k
UK┬г52k┬г70k┬г98k
EUтВм58kтВм78kтВм110k
CANADAC$88kC$120kC$168k

ЁЯОп Shell Scripting рд╡рд╛рдкрд░рдгрд╛рд░реА рдХрд░рд┐рдЕрд░

тЪЦ рдпрд╛рдВрдЪреНрдпрд╛рд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛

тЭУ FAQ

Bash vs Zsh, which should I learn?
Bash: 30+ years, universal (ships on every Unix/Linux/Mac), POSIX-compatible, scripts run everywhere. Zsh: modern, interactive features (completion, history), friendly syntax. Learn Bash first for portability and career breadth, it's the standard for deployment scripts and cron jobs. Zsh after, for your personal shell. Write production scripts in Bash, interactive shell in Zsh. Zsh on macOS is now default, but servers still run Bash.
When should I use Python instead of shell scripts?
Use shell for: file operations, tool orchestration, simple data pipelines, deployment steps, cron jobs, quick 10-50 line tasks. Use Python for: complex logic, data structures, unit testing, maintenance >1000 lines, portability across OS (Windows, macOS, Linux), dependency management. Rule: if your script needs classes, error handling beyond `set -e`, or complex iteration, switch to Python. If it's gluing tools together, stay in shell.
How do I handle errors properly in shell scripts?
Start every script with `set -euo pipefail`: -e stops on error, -u errors on undefined vars, -o pipefail fails if any pipe stage fails. Use functions with explicit return codes. Trap errors: `trap 'echo Error at line $LINENO' ERR`. Quote all variables: `"$var"` not `$var`. Test edge cases: empty input, special characters, large files. Use ShellCheck (`shellcheck script.sh`) to catch common mistakes before runtime.
What does ShellCheck do and why should I use it?
ShellCheck is a linter that finds bugs and portability issues before runtime. It catches: unquoted vars, unreachable code, deprecated syntax, inefficient patterns. Run on every script: `shellcheck myscript.sh`. Integrates with editors (VSCode ShellCheck extension). Warnings = code smell, errors = bugs. Passing ShellCheck is non-negotiable for production scripts. Disable warnings sparingly (`# shellcheck disable=SC2086`) only when you understand the risk.
How do dotfiles work and should I version control them?
Dotfiles (.bashrc, .zshrc, .config/) are shell config and environment setup. Version control them in a git repo (with a README explaining symlinks or bootstrap script). Symlink into home: `ln -s ~/dotfiles/.bashrc ~/.bashrc`. Benefits: reproducible environment, share across machines, collaborate with team. Never hardcode secrets (use .env or `pass` password manager). Popular pattern: `~/dotfiles/install.sh` creates symlinks, runs once per machine.
What are common pitfalls and how do I avoid them?
Pitfall 1: Not quoting variables, causes word splitting and globbing. Fix: `"$var"` always. Pitfall 2: Using `ls` in scripts, parsing output fails with spaces. Fix: use glob patterns or `find`. Pitfall 3: Parsing JSON/YAML with regex, fragile. Fix: use `jq` (JSON) or `yq` (YAML). Pitfall 4: Hardcoding paths, breaks on different systems. Fix: use `$HOME`, `readlink -f`, or relative paths. Pitfall 5: No error context, hard to debug. Fix: add logging and use `PS4` for trace output.
How do I make my shell scripts portable across systems?
Write POSIX-compliant code, not Bash-only. Use `#!/bin/sh` not `#!/bin/bash` when possible. Avoid: `[[]]` (use `[]`), `=~` regex (use `grep`), arrays (use loops). Check syntax: `sh -n script.sh`. Test on multiple systems (Mac, Linux, BSD). Use `env bash` in shebang if Bash required. Document dependencies (jq, curl, awk version). Use `command -v` to check if tools exist before using. Ship with `install.sh` that checks requirements.

рд╣реЗ рдХреМрд╢рд▓реНрдп рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрд╣реЗ рдХрд╛, рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдирд╛рд╣реА?

рдХрд░рд┐рдЕрд░ рдореЕрдЪ рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рдЖрдореНрд╣реА рдпреЛрдЧреНрдп рдорд╛рд░реНрдЧ рд╕реБрдЪрд╡реВ.

рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡реЛрддреНрддрдо рдХреМрд╢рд▓реНрдпреЗ рд╢реЛрдзрд╛ тЖТ

рддреБрдордЪрд╛ рдЖрджрд░реНрд╢ рдХрд░рд┐рдЕрд░ рдорд╛рд░реНрдЧ рд╢реЛрдзрд╛

реи,релреирез рдХрд░рд┐рдЕрд░рдордзреНрдпреЗ рдХреМрд╢рд▓реНрдпрд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЬреБрд│рдгреА. рдореЛрдлрдд, ~3 рдорд┐рдирд┐рдЯреЗ.

рдХрд░рд┐рдЕрд░ рдореЕрдЪ рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рдореЛрдлрдд тЖТ