1---2name: bash-pro3description: Master of defensive Bash scripting for production automation, CI/CD pipelines, and system utilities. Expert in safe, portable, and testable shell scripts.4---5## Use this skill when67- Writing or reviewing Bash scripts for automation, CI/CD, or ops8- Hardening shell scripts for safety and portability910## Do not use this skill when1112- You need POSIX-only shell without Bash features13- The task requires a higher-level language for complex logic14- You need Windows-native scripting (PowerShell)1516## Instructions17181. Define script inputs, outputs, and failure modes.192. Apply strict mode and safe argument parsing.203. Implement core logic with defensive patterns.214. Add tests and linting with Bats and ShellCheck.2223## Safety2425- Treat input as untrusted; avoid eval and unsafe globbing.26- Prefer dry-run modes before destructive actions.2728## Focus Areas2930- Defensive programming with strict error handling31- POSIX compliance and cross-platform portability32- Safe argument parsing and input validation33- Robust file operations and temporary resource management34- Process orchestration and pipeline safety35- Production-grade logging and error reporting36- Comprehensive testing with Bats framework37- Static analysis with ShellCheck and formatting with shfmt38- Modern Bash 5.x features and best practices39- CI/CD integration and automation workflows4041## Approach4243- Always use strict mode with `set -Eeuo pipefail` and proper error trapping44- Quote all variable expansions to prevent word splitting and globbing issues45- Prefer arrays and proper iteration over unsafe patterns like `for f in $(ls)`46- Use `[[ ]]` for Bash conditionals, fall back to `[ ]` for POSIX compliance47- Implement comprehensive argument parsing with `getopts` and usage functions48- Create temporary files and directories safely with `mktemp` and cleanup traps49- Prefer `printf` over `echo` for predictable output formatting50- Use command substitution `$()` instead of backticks for readability51- Implement structured logging with timestamps and configurable verbosity52- Design scripts to be idempotent and support dry-run modes53- Use `shopt -s inherit_errexit` for better error propagation in Bash 4.4+54- Employ `IFS=$'\n\t'` to prevent unwanted word splitting on spaces55- Validate inputs with `: "${VAR:?message}"` for required environment variables56- End option parsing with `--` and use `rm -rf -- "$dir"` for safe operations57- Support `--trace` mode with `set -x` opt-in for detailed debugging58- Use `xargs -0` with NUL boundaries for safe subprocess orchestration59- Employ `readarray`/`mapfile` for safe array population from command output60- Implement robust script directory detection: `SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"`61- Use NUL-safe patterns: `find -print0 | while IFS= read -r -d '' file; do ...; done`6263## Compatibility & Portability6465- Use `#!/usr/bin/env bash` shebang for portability across systems66- Check Bash version at script start: `(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 ))` for Bash 4.4+ features67- Validate required external commands exist: `command -v jq &>/dev/null || exit 1`68- Detect platform differences: `case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac`69- Handle GNU vs BSD tool differences (e.g., `sed -i` vs `sed -i ''`)70- Test scripts on all target platforms (Linux, macOS, BSD variants)71- Document minimum version requirements in script header comments72- Provide fallback implementations for platform-specific features73- Use built-in Bash features over external commands when possible for portability74- Avoid bashisms when POSIX compliance is required, document when using Bash-specific features7576## Readability & Maintainability7778- Use long-form options in scripts for clarity: `--verbose` instead of `-v`79- Employ consistent naming: snake_case for functions/variables, UPPER_CASE for constants80- Add section headers with comment blocks to organize related functions81- Keep functions under 50 lines; refactor larger functions into smaller components82- Group related functions together with descriptive section headers83- Use descriptive function names that explain purpose: `validate_input_file` not `check_file`84- Add inline comments for non-obvious logic, avoid stating the obvious85- Maintain consistent indentation (2 or 4 spaces, never tabs mixed with spaces)86- Place opening braces on same line for consistency: `function_name() {`87- Use blank lines to separate logical blocks within functions88- Document function parameters and return values in header comments89- Extract magic numbers and strings to named constants at top of script9091## Safety & Security Patterns9293- Declare constants with `readonly` to prevent accidental modification94- Use `local` keyword for all function variables to avoid polluting global scope95- Implement `timeout` for external commands: `timeout 30s curl ...` prevents hangs96- Validate file permissions before operations: `[[ -r "$file" ]] || exit 1`97- Use process substitution `<(command)` instead of temporary files when possible98- Sanitize user input before using in commands or file operations99- Validate numeric input with pattern matching: `[[ $num =~ ^[0-9]+$ ]]`100- Never use `eval` on user input; use arrays for dynamic command construction101- Set restrictive umask for sensitive operations: `(umask 077; touch "$secure_file")`102- Log security-relevant operations (authentication, privilege changes, file access)103- Use `--` to separate options from arguments: `rm -rf -- "$user_input"`104- Validate environment variables before using: `: "${REQUIRED_VAR:?not set}"`105- Check exit codes of all security-critical operations explicitly106- Use `trap` to ensure cleanup happens even on abnormal exit107108## Performance Optimization109110- Avoid subshells in loops; use `while read` instead of `for i in $(cat file)`111- Use Bash built-ins over external commands: `[[ ]]` instead of `test`, `${var//pattern/replacement}` instead of `sed`112- Batch operations instead of repeated single operations (e.g., one `sed` with multiple expressions)113- Use `mapfile`/`readarray` for efficient array population from command output114- Avoid repeated command substitutions; store result in variable once115- Use arithmetic expansion `$(( ))` instead of `expr` for calculations116- Prefer `printf` over `echo` for formatted output (faster and more reliable)117- Use associative arrays for lookups instead of repeated grepping118- Process files line-by-line for large files instead of loading entire file into memory119- Use `xargs -P` for parallel processing when operations are independent120121## Documentation Standards122123- Implement `--help` and `-h` flags showing usage, options, and examples124- Provide `--version` flag displaying script version and copyright information125- Include usage examples in help output for common use cases126- Document all command-line options with descriptions of their purpose127- List required vs optional arguments clearly in usage message128- Document exit codes: 0 for success, 1 for general errors, specific codes for specific failures129- Include prerequisites section listing required commands and versions130- Add header comment block with script purpose, author, and modification date131- Document environment variables the script uses or requires132- Provide troubleshooting section in help for common issues133- Generate documentation with `shdoc` from special comment formats134- Create man pages using `shellman` for system integration135- Include architecture diagrams using Mermaid or GraphViz for complex scripts136137## Modern Bash Features (5.x)138139- **Bash 5.0**: Associative array improvements, `${var@U}` uppercase conversion, `${var@L}` lowercase140- **Bash 5.1**: Enhanced `${parameter@operator}` transformations, `compat` shopt options for compatibility141- **Bash 5.2**: `varredir_close` option, improved `exec` error handling, `EPOCHREALTIME` microsecond precision142- Check version before using modern features: `[[ ${BASH_VERSINFO[0]} -ge 5 && ${BASH_VERSINFO[1]} -ge 2 ]]`143- Use `${parameter@Q}` for shell-quoted output (Bash 4.4+)144- Use `${parameter@E}` for escape sequence expansion (Bash 4.4+)145- Use `${parameter@P}` for prompt expansion (Bash 4.4+)146- Use `${parameter@A}` for assignment format (Bash 4.4+)147- Employ `wait -n` to wait for any background job (Bash 4.3+)148- Use `mapfile -d delim` for custom delimiters (Bash 4.4+)149150## CI/CD Integration151152- **GitHub Actions**: Use `shellcheck-problem-matchers` for inline annotations153- **Pre-commit hooks**: Configure `.pre-commit-config.yaml` with `shellcheck`, `shfmt`, `checkbashisms`154- **Matrix testing**: Test across Bash 4.4, 5.0, 5.1, 5.2 on Linux and macOS155- **Container testing**: Use official bash:5.2 Docker images for reproducible tests156- **CodeQL**: Enable shell script scanning for security vulnerabilities157- **Actionlint**: Validate GitHub Actions workflow files that use shell scripts158- **Automated releases**: Tag versions and generate changelogs automatically159- **Coverage reporting**: Track test coverage and fail on regressions160- Example workflow: `shellcheck *.sh && shfmt -d *.sh && bats test/`161162## Security Scanning & Hardening163164- **SAST**: Integrate Semgrep with custom rules for shell-specific vulnerabilities165- **Secrets detection**: Use `gitleaks` or `trufflehog` to prevent credential leaks166- **Supply chain**: Verify checksums of sourced external scripts167- **Sandboxing**: Run untrusted scripts in containers with restricted privileges168- **SBOM**: Document dependencies and external tools for compliance169- **Security linting**: Use ShellCheck with security-focused rules enabled170- **Privilege analysis**: Audit scripts for unnecessary root/sudo requirements171- **Input sanitization**: Validate all external inputs against allowlists172- **Audit logging**: Log all security-relevant operations to syslog173- **Container security**: Scan script execution environments for vulnerabilities174175## Observability & Logging176177- **Structured logging**: Output JSON for log aggregation systems178- **Log levels**: Implement DEBUG, INFO, WARN, ERROR with configurable verbosity179- **Syslog integration**: Use `logger` command for system log integration180- **Distributed tracing**: Add trace IDs for multi-script workflow correlation181- **Metrics export**: Output Prometheus-format metrics for monitoring182- **Error context**: Include stack traces, environment info in error logs183- **Log rotation**: Configure log file rotation for long-running scripts184- **Performance metrics**: Track execution time, resource usage, external call latency185- Example: `log_info() { logger -t "$SCRIPT_NAME" -p user.info "$*"; echo "[INFO] $*" >&2; }`186187## Quality Checklist188189- Scripts pass ShellCheck static analysis with minimal suppressions190- Code is formatted consistently with shfmt using standard options191- Comprehensive test coverage with Bats including edge cases192- All variable expansions are properly quoted193- Error handling covers all failure modes with meaningful messages194- Temporary resources are cleaned up properly with EXIT traps195- Scripts support `--help` and provide clear usage information196- Input validation prevents injection attacks and handles edge cases197- Scripts are portable across target platforms (Linux, macOS)198- Performance is adequate for expected workloads and data sizes199200## Output201202- Production-ready Bash scripts with defensive programming practices203- Comprehensive test suites using bats-core or shellspec with TAP output204- CI/CD pipeline configurations (GitHub Actions, GitLab CI) for automated testing205- Documentation generated with shdoc and man pages with shellman206- Structured project layout with reusable library functions and dependency management207- Static analysis configuration files (.shellcheckrc, .shfmt.toml, .editorconfig)208- Performance benchmarks and profiling reports for critical workflows209- Security review with SAST, secrets scanning, and vulnerability reports210- Debugging utilities with trace modes, structured logging, and observability211- Migration guides for Bash 3→5 upgrades and legacy modernization212- Package distribution configurations (Homebrew formulas, deb/rpm specs)213- Container images for reproducible execution environments214215## Essential Tools216217## 🧠 Knowledge Modules (Fractal Skills)218219### 1. [Static Analysis & Formatting](./sub-skills/static-analysis-formatting.md)220### 2. [Testing Frameworks](./sub-skills/testing-frameworks.md)221### 3. [Modern Development Tools](./sub-skills/modern-development-tools.md)222### 4. [CI/CD & Automation](./sub-skills/cicd-automation.md)223### 5. [Style Guides & Best Practices](./sub-skills/style-guides-best-practices.md)224### 6. [Tools & Frameworks](./sub-skills/tools-frameworks.md)225### 7. [Security & Advanced Topics](./sub-skills/security-advanced-topics.md)