Use this skill when
- Writing or reviewing Bash scripts for automation, CI/CD, or ops
- Hardening shell scripts for safety and portability
Do not use this skill when
- You need POSIX-only shell without Bash features
- The task requires a higher-level language for complex logic
- You need Windows-native scripting (PowerShell)
Instructions
- Define script inputs, outputs, and failure modes.
- Apply strict mode and safe argument parsing.
- Implement core logic with defensive patterns.
- Add tests and linting with Bats and ShellCheck.
Safety
- Treat input as untrusted; avoid eval and unsafe globbing.
- Prefer dry-run modes before destructive actions.
Focus Areas
- Defensive programming with strict error handling
- POSIX compliance and cross-platform portability
- Safe argument parsing and input validation
- Robust file operations and temporary resource management
- Process orchestration and pipeline safety
- Production-grade logging and error reporting
- Comprehensive testing with Bats framework
- Static analysis with ShellCheck and formatting with shfmt
- Modern Bash 5.x features and best practices
- CI/CD integration and automation workflows
Approach
- Always use strict mode with
set -Eeuo pipefail and proper error trapping
- Quote all variable expansions to prevent word splitting and globbing issues
- Prefer arrays and proper iteration over unsafe patterns like
for f in $(ls)
- Use
[[ ]] for Bash conditionals, fall back to [ ] for POSIX compliance
- Implement comprehensive argument parsing with
getopts and usage functions
- Create temporary files and directories safely with
mktemp and cleanup traps
- Prefer
printf over echo for predictable output formatting
- Use command substitution
$() instead of backticks for readability
- Implement structured logging with timestamps and configurable verbosity
- Design scripts to be idempotent and support dry-run modes
- Use
shopt -s inherit_errexit for better error propagation in Bash 4.4+
- Employ
IFS=$'\n\t' to prevent unwanted word splitting on spaces
- Validate inputs with
: "${VAR:?message}" for required environment variables
- End option parsing with
-- and use rm -rf -- "$dir" for safe operations
- Support
--trace mode with set -x opt-in for detailed debugging
- Use
xargs -0 with NUL boundaries for safe subprocess orchestration
- Employ
readarray/mapfile for safe array population from command output
- Implement robust script directory detection:
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
- Use NUL-safe patterns:
find -print0 | while IFS= read -r -d '' file; do ...; done
Compatibility & Portability
- Use
#!/usr/bin/env bash shebang for portability across systems
- Check Bash version at script start:
(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 )) for Bash 4.4+ features
- Validate required external commands exist:
command -v jq &>/dev/null || exit 1
- Detect platform differences:
case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac
- Handle GNU vs BSD tool differences (e.g.,
sed -i vs sed -i '')
- Test scripts on all target platforms (Linux, macOS, BSD variants)
- Document minimum version requirements in script header comments
- Provide fallback implementations for platform-specific features
- Use built-in Bash features over external commands when possible for portability
- Avoid bashisms when POSIX compliance is required, document when using Bash-specific features
Readability & Maintainability
- Use long-form options in scripts for clarity:
--verbose instead of -v
- Employ consistent naming: snake_case for functions/variables, UPPER_CASE for constants
- Add section headers with comment blocks to organize related functions
- Keep functions under 50 lines; refactor larger functions into smaller components
- Group related functions together with descriptive section headers
- Use descriptive function names that explain purpose:
validate_input_file not check_file
- Add inline comments for non-obvious logic, avoid stating the obvious
- Maintain consistent indentation (2 or 4 spaces, never tabs mixed with spaces)
- Place opening braces on same line for consistency:
function_name() {
- Use blank lines to separate logical blocks within functions
- Document function parameters and return values in header comments
- Extract magic numbers and strings to named constants at top of script
Safety & Security Patterns
- Declare constants with
readonly to prevent accidental modification
- Use
local keyword for all function variables to avoid polluting global scope
- Implement
timeout for external commands: timeout 30s curl ... prevents hangs
- Validate file permissions before operations:
[[ -r "$file" ]] || exit 1
- Use process substitution
<(command) instead of temporary files when possible
- Sanitize user input before using in commands or file operations
- Validate numeric input with pattern matching:
[[ $num =~ ^[0-9]+$ ]]
- Never use
eval on user input; use arrays for dynamic command construction
- Set restrictive umask for sensitive operations:
(umask 077; touch "$secure_file")
- Log security-relevant operations (authentication, privilege changes, file access)
- Use
-- to separate options from arguments: rm -rf -- "$user_input"
- Validate environment variables before using:
: "${REQUIRED_VAR:?not set}"
- Check exit codes of all security-critical operations explicitly
- Use
trap to ensure cleanup happens even on abnormal exit
Performance Optimization
- Avoid subshells in loops; use
while read instead of for i in $(cat file)
- Use Bash built-ins over external commands:
[[ ]] instead of test, ${var//pattern/replacement} instead of sed
- Batch operations instead of repeated single operations (e.g., one
sed with multiple expressions)
- Use
mapfile/readarray for efficient array population from command output
- Avoid repeated command substitutions; store result in variable once
- Use arithmetic expansion
$(( )) instead of expr for calculations
- Prefer
printf over echo for formatted output (faster and more reliable)
- Use associative arrays for lookups instead of repeated grepping
- Process files line-by-line for large files instead of loading entire file into memory
- Use
xargs -P for parallel processing when operations are independent
Documentation Standards
- Implement
--help and -h flags showing usage, options, and examples
- Provide
--version flag displaying script version and copyright information
- Include usage examples in help output for common use cases
- Document all command-line options with descriptions of their purpose
- List required vs optional arguments clearly in usage message
- Document exit codes: 0 for success, 1 for general errors, specific codes for specific failures
- Include prerequisites section listing required commands and versions
- Add header comment block with script purpose, author, and modification date
- Document environment variables the script uses or requires
- Provide troubleshooting section in help for common issues
- Generate documentation with
shdoc from special comment formats
- Create man pages using
shellman for system integration
- Include architecture diagrams using Mermaid or GraphViz for complex scripts
Modern Bash Features (5.x)
- Bash 5.0: Associative array improvements,
${var@U} uppercase conversion, ${var@L} lowercase
- Bash 5.1: Enhanced
${parameter@operator} transformations, compat shopt options for compatibility
- Bash 5.2:
varredir_close option, improved exec error handling, EPOCHREALTIME microsecond precision
- Check version before using modern features:
[[ ${BASH_VERSINFO[0]} -ge 5 && ${BASH_VERSINFO[1]} -ge 2 ]]
- Use
${parameter@Q} for shell-quoted output (Bash 4.4+)
- Use
${parameter@E} for escape sequence expansion (Bash 4.4+)
- Use
${parameter@P} for prompt expansion (Bash 4.4+)
- Use
${parameter@A} for assignment format (Bash 4.4+)
- Employ
wait -n to wait for any background job (Bash 4.3+)
- Use
mapfile -d delim for custom delimiters (Bash 4.4+)
CI/CD Integration
- GitHub Actions: Use
shellcheck-problem-matchers for inline annotations
- Pre-commit hooks: Configure
.pre-commit-config.yaml with shellcheck, shfmt, checkbashisms
- Matrix testing: Test across Bash 4.4, 5.0, 5.1, 5.2 on Linux and macOS
- Container testing: Use official bash:5.2 Docker images for reproducible tests
- CodeQL: Enable shell script scanning for security vulnerabilities
- Actionlint: Validate GitHub Actions workflow files that use shell scripts
- Automated releases: Tag versions and generate changelogs automatically
- Coverage reporting: Track test coverage and fail on regressions
- Example workflow:
shellcheck *.sh && shfmt -d *.sh && bats test/
Security Scanning & Hardening
- SAST: Integrate Semgrep with custom rules for shell-specific vulnerabilities
- Secrets detection: Use
gitleaks or trufflehog to prevent credential leaks
- Supply chain: Verify checksums of sourced external scripts
- Sandboxing: Run untrusted scripts in containers with restricted privileges
- SBOM: Document dependencies and external tools for compliance
- Security linting: Use ShellCheck with security-focused rules enabled
- Privilege analysis: Audit scripts for unnecessary root/sudo requirements
- Input sanitization: Validate all external inputs against allowlists
- Audit logging: Log all security-relevant operations to syslog
- Container security: Scan script execution environments for vulnerabilities
Observability & Logging
- Structured logging: Output JSON for log aggregation systems
- Log levels: Implement DEBUG, INFO, WARN, ERROR with configurable verbosity
- Syslog integration: Use
logger command for system log integration
- Distributed tracing: Add trace IDs for multi-script workflow correlation
- Metrics export: Output Prometheus-format metrics for monitoring
- Error context: Include stack traces, environment info in error logs
- Log rotation: Configure log file rotation for long-running scripts
- Performance metrics: Track execution time, resource usage, external call latency
- Example:
log_info() { logger -t "$SCRIPT_NAME" -p user.info "$*"; echo "[INFO] $*" >&2; }
Quality Checklist
- Scripts pass ShellCheck static analysis with minimal suppressions
- Code is formatted consistently with shfmt using standard options
- Comprehensive test coverage with Bats including edge cases
- All variable expansions are properly quoted
- Error handling covers all failure modes with meaningful messages
- Temporary resources are cleaned up properly with EXIT traps
- Scripts support
--help and provide clear usage information
- Input validation prevents injection attacks and handles edge cases
- Scripts are portable across target platforms (Linux, macOS)
- Performance is adequate for expected workloads and data sizes
Output
- Production-ready Bash scripts with defensive programming practices
- Comprehensive test suites using bats-core or shellspec with TAP output
- CI/CD pipeline configurations (GitHub Actions, GitLab CI) for automated testing
- Documentation generated with shdoc and man pages with shellman
- Structured project layout with reusable library functions and dependency management
- Static analysis configuration files (.shellcheckrc, .shfmt.toml, .editorconfig)
- Performance benchmarks and profiling reports for critical workflows
- Security review with SAST, secrets scanning, and vulnerability reports
- Debugging utilities with trace modes, structured logging, and observability
- Migration guides for Bash 3→5 upgrades and legacy modernization
- Package distribution configurations (Homebrew formulas, deb/rpm specs)
- Container images for reproducible execution environments
Essential Tools
Static Analysis & Formatting
- ShellCheck: Static analyzer with
enable=all and external-sources=true configuration
- shfmt: Shell script formatter with standard config (
-i 2 -ci -bn -sr -kp)
- checkbashisms: Detect bash-specific constructs for portability analysis
- Semgrep: SAST with custom rules for shell-specific security issues
- CodeQL: GitHub's security scanning for shell scripts
Testing Frameworks
- bats-core: Maintained fork of Bats with modern features and active development
- shellspec: BDD-style testing framework with rich assertions and mocking
- shunit2: xUnit-style testing framework for shell scripts
- bashing: Testing framework with mocking support and test isolation
Modern Development Tools
- bashly: CLI framework generator for building command-line applications
- basher: Bash package manager for dependency management
- bpkg: Alternative bash package manager with npm-like interface
- shdoc: Generate markdown documentation from shell script comments
- shellman: Generate man pages from shell scripts
CI/CD & Automation
- pre-commit: Multi-language pre-commit hook framework
- actionlint: GitHub Actions workflow linter
- gitleaks: Secrets scanning to prevent credential leaks
- Makefile: Automation for lint, format, test, and release workflows
Common Pitfalls to Avoid
for f in $(ls ...) causing word splitting/globbing bugs (use find -print0 | while IFS= read -r -d '' f; do ...; done)
- Unquoted variable expansions leading to unexpected behavior
- Relying on
set -e without proper error trapping in complex flows
- Using
echo for data output (prefer printf for reliability)
- Missing cleanup traps for temporary files and directories
- Unsafe array population (use
readarray/mapfile instead of command substitution)
- Ignoring binary-safe file handling (always consider NUL separators for filenames)
Dependency Management
- Package managers: Use
basher or bpkg for installing shell script dependencies
- Vendoring: Copy dependencies into project for reproducible builds
- Lock files: Document exact versions of dependencies used
- Checksum verification: Verify integrity of sourced external scripts
- Version pinning: Lock dependencies to specific versions to prevent breaking changes
- Dependency isolation: Use separate directories for different dependency sets
- Update automation: Automate dependency updates with Dependabot or Renovate
- Security scanning: Scan dependencies for known vulnerabilities
- Example:
basher install username/repo@version or bpkg install username/repo -g
Advanced Techniques
- Error Context: Use
trap 'echo "Error at line $LINENO: exit $?" >&2' ERR for debugging
- Safe Temp Handling:
trap 'rm -rf "$tmpdir"' EXIT; tmpdir=$(mktemp -d)
- Version Checking:
(( BASH_VERSINFO[0] >= 5 )) before using modern features
- Binary-Safe Arrays:
readarray -d '' files < <(find . -print0)
- Function Returns: Use
declare -g result for returning complex data from functions
- Associative Arrays:
declare -A config=([host]="localhost" [port]="8080") for complex data structures
- Parameter Expansion:
${filename%.sh} remove extension, ${path##*/} basename, ${text//old/new} replace all
- Signal Handling:
trap cleanup_function SIGHUP SIGINT SIGTERM for graceful shutdown
- Command Grouping:
{ cmd1; cmd2; } > output.log share redirection, ( cd dir && cmd ) use subshell for isolation
- Co-processes:
coproc proc { cmd; }; echo "data" >&"${proc[1]}"; read -u "${proc[0]}" result for bidirectional pipes
- Here-documents:
cat <<-'EOF' with - strips leading tabs, quotes prevent expansion
- Process Management:
wait $pid to wait for background job, jobs -p list background PIDs
- Conditional Execution:
cmd1 && cmd2 run cmd2 only if cmd1 succeeds, cmd1 || cmd2 run cmd2 if cmd1 fails
- Brace Expansion:
touch file{1..10}.txt creates multiple files efficiently
- Nameref Variables:
declare -n ref=varname creates reference to another variable (Bash 4.3+)
- Improved Error Trapping:
set -Eeuo pipefail; shopt -s inherit_errexit for comprehensive error handling
- Parallel Execution:
xargs -P $(nproc) -n 1 command for parallel processing with CPU core count
- Structured Output:
jq -n --arg key "$value" '{key: $key}' for JSON generation
- Performance Profiling: Use
time -v for detailed resource usage or TIMEFORMAT for custom timing
References & Further Reading
Style Guides & Best Practices
Tools & Frameworks
- ShellCheck - Static analysis tool and extensive wiki documentation
- shfmt - Shell script formatter with detailed flag documentation
- bats-core - Maintained Bash testing framework
- shellspec - BDD-style testing framework for shell scripts
- bashly - Modern Bash CLI framework generator
- shdoc - Documentation generator for shell scripts
Security & Advanced Topics
AGI Framework Integration
Adapted for @techwavedev/agi-agent-kit
Original source: antigravity-awesome-skills
Memory-First Protocol
Retrieve prior deployment configurations, rollback procedures, and incident post-mortems. Avoid re-discovering infrastructure patterns.
# Check for prior infrastructure context before starting
python3 execution/memory_manager.py auto --query "deployment configuration and patterns for Bash Pro"
Storing Results
After completing work, store infrastructure decisions for future sessions:
python3 execution/memory_manager.py store \
--content "Deployment pipeline: configured blue-green deployment with health checks on port 8080" \
--type technical --project <project> \
--tags bash-pro devops
Multi-Agent Collaboration
Broadcast deployment changes so frontend and backend agents update their configurations accordingly.
python3 execution/cross_agent_context.py store \
--agent "<your-agent>" \
--action "Deployed infrastructure changes — updated CI/CD pipeline with new health check endpoints" \
--project <project>
Playbook Integration
Use the ship-saas-mvp or full-stack-deploy playbook to sequence this skill with testing, documentation, and deployment verification.
1---2name: bash-pro3description: 'Master of defensive Bash scripting for production automation, CI/CD45 pipelines, and system utilities. Expert in safe, portable, and testable shell67 scripts.89 '10risk: critical11source: community12date_added: '2026-02-27'13---1415## Use this skill when1617- Writing or reviewing Bash scripts for automation, CI/CD, or ops18- Hardening shell scripts for safety and portability1920## Do not use this skill when2122- You need POSIX-only shell without Bash features23- The task requires a higher-level language for complex logic24- You need Windows-native scripting (PowerShell)2526## Instructions27281. Define script inputs, outputs, and failure modes.292. Apply strict mode and safe argument parsing.303. Implement core logic with defensive patterns.314. Add tests and linting with Bats and ShellCheck.3233## Safety3435- Treat input as untrusted; avoid eval and unsafe globbing.36- Prefer dry-run modes before destructive actions.3738## Focus Areas3940- Defensive programming with strict error handling41- POSIX compliance and cross-platform portability42- Safe argument parsing and input validation43- Robust file operations and temporary resource management44- Process orchestration and pipeline safety45- Production-grade logging and error reporting46- Comprehensive testing with Bats framework47- Static analysis with ShellCheck and formatting with shfmt48- Modern Bash 5.x features and best practices49- CI/CD integration and automation workflows5051## Approach5253- Always use strict mode with `set -Eeuo pipefail` and proper error trapping54- Quote all variable expansions to prevent word splitting and globbing issues55- Prefer arrays and proper iteration over unsafe patterns like `for f in $(ls)`56- Use `[[ ]]` for Bash conditionals, fall back to `[ ]` for POSIX compliance57- Implement comprehensive argument parsing with `getopts` and usage functions58- Create temporary files and directories safely with `mktemp` and cleanup traps59- Prefer `printf` over `echo` for predictable output formatting60- Use command substitution `$()` instead of backticks for readability61- Implement structured logging with timestamps and configurable verbosity62- Design scripts to be idempotent and support dry-run modes63- Use `shopt -s inherit_errexit` for better error propagation in Bash 4.4+64- Employ `IFS=$'\n\t'` to prevent unwanted word splitting on spaces65- Validate inputs with `: "${VAR:?message}"` for required environment variables66- End option parsing with `--` and use `rm -rf -- "$dir"` for safe operations67- Support `--trace` mode with `set -x` opt-in for detailed debugging68- Use `xargs -0` with NUL boundaries for safe subprocess orchestration69- Employ `readarray`/`mapfile` for safe array population from command output70- Implement robust script directory detection: `SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"`71- Use NUL-safe patterns: `find -print0 | while IFS= read -r -d '' file; do ...; done`7273## Compatibility & Portability7475- Use `#!/usr/bin/env bash` shebang for portability across systems76- Check Bash version at script start: `(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 ))` for Bash 4.4+ features77- Validate required external commands exist: `command -v jq &>/dev/null || exit 1`78- Detect platform differences: `case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac`79- Handle GNU vs BSD tool differences (e.g., `sed -i` vs `sed -i ''`)80- Test scripts on all target platforms (Linux, macOS, BSD variants)81- Document minimum version requirements in script header comments82- Provide fallback implementations for platform-specific features83- Use built-in Bash features over external commands when possible for portability84- Avoid bashisms when POSIX compliance is required, document when using Bash-specific features8586## Readability & Maintainability8788- Use long-form options in scripts for clarity: `--verbose` instead of `-v`89- Employ consistent naming: snake_case for functions/variables, UPPER_CASE for constants90- Add section headers with comment blocks to organize related functions91- Keep functions under 50 lines; refactor larger functions into smaller components92- Group related functions together with descriptive section headers93- Use descriptive function names that explain purpose: `validate_input_file` not `check_file`94- Add inline comments for non-obvious logic, avoid stating the obvious95- Maintain consistent indentation (2 or 4 spaces, never tabs mixed with spaces)96- Place opening braces on same line for consistency: `function_name() {`97- Use blank lines to separate logical blocks within functions98- Document function parameters and return values in header comments99- Extract magic numbers and strings to named constants at top of script100101## Safety & Security Patterns102103- Declare constants with `readonly` to prevent accidental modification104- Use `local` keyword for all function variables to avoid polluting global scope105- Implement `timeout` for external commands: `timeout 30s curl ...` prevents hangs106- Validate file permissions before operations: `[[ -r "$file" ]] || exit 1`107- Use process substitution `<(command)` instead of temporary files when possible108- Sanitize user input before using in commands or file operations109- Validate numeric input with pattern matching: `[[ $num =~ ^[0-9]+$ ]]`110- Never use `eval` on user input; use arrays for dynamic command construction111- Set restrictive umask for sensitive operations: `(umask 077; touch "$secure_file")`112- Log security-relevant operations (authentication, privilege changes, file access)113- Use `--` to separate options from arguments: `rm -rf -- "$user_input"`114- Validate environment variables before using: `: "${REQUIRED_VAR:?not set}"`115- Check exit codes of all security-critical operations explicitly116- Use `trap` to ensure cleanup happens even on abnormal exit117118## Performance Optimization119120- Avoid subshells in loops; use `while read` instead of `for i in $(cat file)`121- Use Bash built-ins over external commands: `[[ ]]` instead of `test`, `${var//pattern/replacement}` instead of `sed`122- Batch operations instead of repeated single operations (e.g., one `sed` with multiple expressions)123- Use `mapfile`/`readarray` for efficient array population from command output124- Avoid repeated command substitutions; store result in variable once125- Use arithmetic expansion `$(( ))` instead of `expr` for calculations126- Prefer `printf` over `echo` for formatted output (faster and more reliable)127- Use associative arrays for lookups instead of repeated grepping128- Process files line-by-line for large files instead of loading entire file into memory129- Use `xargs -P` for parallel processing when operations are independent130131## Documentation Standards132133- Implement `--help` and `-h` flags showing usage, options, and examples134- Provide `--version` flag displaying script version and copyright information135- Include usage examples in help output for common use cases136- Document all command-line options with descriptions of their purpose137- List required vs optional arguments clearly in usage message138- Document exit codes: 0 for success, 1 for general errors, specific codes for specific failures139- Include prerequisites section listing required commands and versions140- Add header comment block with script purpose, author, and modification date141- Document environment variables the script uses or requires142- Provide troubleshooting section in help for common issues143- Generate documentation with `shdoc` from special comment formats144- Create man pages using `shellman` for system integration145- Include architecture diagrams using Mermaid or GraphViz for complex scripts146147## Modern Bash Features (5.x)148149- **Bash 5.0**: Associative array improvements, `${var@U}` uppercase conversion, `${var@L}` lowercase150- **Bash 5.1**: Enhanced `${parameter@operator}` transformations, `compat` shopt options for compatibility151- **Bash 5.2**: `varredir_close` option, improved `exec` error handling, `EPOCHREALTIME` microsecond precision152- Check version before using modern features: `[[ ${BASH_VERSINFO[0]} -ge 5 && ${BASH_VERSINFO[1]} -ge 2 ]]`153- Use `${parameter@Q}` for shell-quoted output (Bash 4.4+)154- Use `${parameter@E}` for escape sequence expansion (Bash 4.4+)155- Use `${parameter@P}` for prompt expansion (Bash 4.4+)156- Use `${parameter@A}` for assignment format (Bash 4.4+)157- Employ `wait -n` to wait for any background job (Bash 4.3+)158- Use `mapfile -d delim` for custom delimiters (Bash 4.4+)159160## CI/CD Integration161162- **GitHub Actions**: Use `shellcheck-problem-matchers` for inline annotations163- **Pre-commit hooks**: Configure `.pre-commit-config.yaml` with `shellcheck`, `shfmt`, `checkbashisms`164- **Matrix testing**: Test across Bash 4.4, 5.0, 5.1, 5.2 on Linux and macOS165- **Container testing**: Use official bash:5.2 Docker images for reproducible tests166- **CodeQL**: Enable shell script scanning for security vulnerabilities167- **Actionlint**: Validate GitHub Actions workflow files that use shell scripts168- **Automated releases**: Tag versions and generate changelogs automatically169- **Coverage reporting**: Track test coverage and fail on regressions170- Example workflow: `shellcheck *.sh && shfmt -d *.sh && bats test/`171172## Security Scanning & Hardening173174- **SAST**: Integrate Semgrep with custom rules for shell-specific vulnerabilities175- **Secrets detection**: Use `gitleaks` or `trufflehog` to prevent credential leaks176- **Supply chain**: Verify checksums of sourced external scripts177- **Sandboxing**: Run untrusted scripts in containers with restricted privileges178- **SBOM**: Document dependencies and external tools for compliance179- **Security linting**: Use ShellCheck with security-focused rules enabled180- **Privilege analysis**: Audit scripts for unnecessary root/sudo requirements181- **Input sanitization**: Validate all external inputs against allowlists182- **Audit logging**: Log all security-relevant operations to syslog183- **Container security**: Scan script execution environments for vulnerabilities184185## Observability & Logging186187- **Structured logging**: Output JSON for log aggregation systems188- **Log levels**: Implement DEBUG, INFO, WARN, ERROR with configurable verbosity189- **Syslog integration**: Use `logger` command for system log integration190- **Distributed tracing**: Add trace IDs for multi-script workflow correlation191- **Metrics export**: Output Prometheus-format metrics for monitoring192- **Error context**: Include stack traces, environment info in error logs193- **Log rotation**: Configure log file rotation for long-running scripts194- **Performance metrics**: Track execution time, resource usage, external call latency195- Example: `log_info() { logger -t "$SCRIPT_NAME" -p user.info "$*"; echo "[INFO] $*" >&2; }`196197## Quality Checklist198199- Scripts pass ShellCheck static analysis with minimal suppressions200- Code is formatted consistently with shfmt using standard options201- Comprehensive test coverage with Bats including edge cases202- All variable expansions are properly quoted203- Error handling covers all failure modes with meaningful messages204- Temporary resources are cleaned up properly with EXIT traps205- Scripts support `--help` and provide clear usage information206- Input validation prevents injection attacks and handles edge cases207- Scripts are portable across target platforms (Linux, macOS)208- Performance is adequate for expected workloads and data sizes209210## Output211212- Production-ready Bash scripts with defensive programming practices213- Comprehensive test suites using bats-core or shellspec with TAP output214- CI/CD pipeline configurations (GitHub Actions, GitLab CI) for automated testing215- Documentation generated with shdoc and man pages with shellman216- Structured project layout with reusable library functions and dependency management217- Static analysis configuration files (.shellcheckrc, .shfmt.toml, .editorconfig)218- Performance benchmarks and profiling reports for critical workflows219- Security review with SAST, secrets scanning, and vulnerability reports220- Debugging utilities with trace modes, structured logging, and observability221- Migration guides for Bash 3→5 upgrades and legacy modernization222- Package distribution configurations (Homebrew formulas, deb/rpm specs)223- Container images for reproducible execution environments224225## Essential Tools226227### Static Analysis & Formatting228- **ShellCheck**: Static analyzer with `enable=all` and `external-sources=true` configuration229- **shfmt**: Shell script formatter with standard config (`-i 2 -ci -bn -sr -kp`)230- **checkbashisms**: Detect bash-specific constructs for portability analysis231- **Semgrep**: SAST with custom rules for shell-specific security issues232- **CodeQL**: GitHub's security scanning for shell scripts233234### Testing Frameworks235- **bats-core**: Maintained fork of Bats with modern features and active development236- **shellspec**: BDD-style testing framework with rich assertions and mocking237- **shunit2**: xUnit-style testing framework for shell scripts238- **bashing**: Testing framework with mocking support and test isolation239240### Modern Development Tools241- **bashly**: CLI framework generator for building command-line applications242- **basher**: Bash package manager for dependency management243- **bpkg**: Alternative bash package manager with npm-like interface244- **shdoc**: Generate markdown documentation from shell script comments245- **shellman**: Generate man pages from shell scripts246247### CI/CD & Automation248- **pre-commit**: Multi-language pre-commit hook framework249- **actionlint**: GitHub Actions workflow linter250- **gitleaks**: Secrets scanning to prevent credential leaks251- **Makefile**: Automation for lint, format, test, and release workflows252253## Common Pitfalls to Avoid254255- `for f in $(ls ...)` causing word splitting/globbing bugs (use `find -print0 | while IFS= read -r -d '' f; do ...; done`)256- Unquoted variable expansions leading to unexpected behavior257- Relying on `set -e` without proper error trapping in complex flows258- Using `echo` for data output (prefer `printf` for reliability)259- Missing cleanup traps for temporary files and directories260- Unsafe array population (use `readarray`/`mapfile` instead of command substitution)261- Ignoring binary-safe file handling (always consider NUL separators for filenames)262263## Dependency Management264265- **Package managers**: Use `basher` or `bpkg` for installing shell script dependencies266- **Vendoring**: Copy dependencies into project for reproducible builds267- **Lock files**: Document exact versions of dependencies used268- **Checksum verification**: Verify integrity of sourced external scripts269- **Version pinning**: Lock dependencies to specific versions to prevent breaking changes270- **Dependency isolation**: Use separate directories for different dependency sets271- **Update automation**: Automate dependency updates with Dependabot or Renovate272- **Security scanning**: Scan dependencies for known vulnerabilities273- Example: `basher install username/repo@version` or `bpkg install username/repo -g`274275## Advanced Techniques276277- **Error Context**: Use `trap 'echo "Error at line $LINENO: exit $?" >&2' ERR` for debugging278- **Safe Temp Handling**: `trap 'rm -rf "$tmpdir"' EXIT; tmpdir=$(mktemp -d)`279- **Version Checking**: `(( BASH_VERSINFO[0] >= 5 ))` before using modern features280- **Binary-Safe Arrays**: `readarray -d '' files < <(find . -print0)`281- **Function Returns**: Use `declare -g result` for returning complex data from functions282- **Associative Arrays**: `declare -A config=([host]="localhost" [port]="8080")` for complex data structures283- **Parameter Expansion**: `${filename%.sh}` remove extension, `${path##*/}` basename, `${text//old/new}` replace all284- **Signal Handling**: `trap cleanup_function SIGHUP SIGINT SIGTERM` for graceful shutdown285- **Command Grouping**: `{ cmd1; cmd2; } > output.log` share redirection, `( cd dir && cmd )` use subshell for isolation286- **Co-processes**: `coproc proc { cmd; }; echo "data" >&"${proc[1]}"; read -u "${proc[0]}" result` for bidirectional pipes287- **Here-documents**: `cat <<-'EOF'` with `-` strips leading tabs, quotes prevent expansion288- **Process Management**: `wait $pid` to wait for background job, `jobs -p` list background PIDs289- **Conditional Execution**: `cmd1 && cmd2` run cmd2 only if cmd1 succeeds, `cmd1 || cmd2` run cmd2 if cmd1 fails290- **Brace Expansion**: `touch file{1..10}.txt` creates multiple files efficiently291- **Nameref Variables**: `declare -n ref=varname` creates reference to another variable (Bash 4.3+)292- **Improved Error Trapping**: `set -Eeuo pipefail; shopt -s inherit_errexit` for comprehensive error handling293- **Parallel Execution**: `xargs -P $(nproc) -n 1 command` for parallel processing with CPU core count294- **Structured Output**: `jq -n --arg key "$value" '{key: $key}'` for JSON generation295- **Performance Profiling**: Use `time -v` for detailed resource usage or `TIMEFORMAT` for custom timing296297## References & Further Reading298299### Style Guides & Best Practices300- [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html) - Comprehensive style guide covering quoting, arrays, and when to use shell301- [Bash Pitfalls](https://mywiki.wooledge.org/BashPitfalls) - Catalog of common Bash mistakes and how to avoid them302- [Bash Hackers Wiki](https://wiki.bash-hackers.org/) - Comprehensive Bash documentation and advanced techniques303- [Defensive BASH Programming](https://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming/) - Modern defensive programming patterns304305### Tools & Frameworks306- [ShellCheck](https://github.com/koalaman/shellcheck) - Static analysis tool and extensive wiki documentation307- [shfmt](https://github.com/mvdan/sh) - Shell script formatter with detailed flag documentation308- [bats-core](https://github.com/bats-core/bats-core) - Maintained Bash testing framework309- [shellspec](https://github.com/shellspec/shellspec) - BDD-style testing framework for shell scripts310- [bashly](https://bashly.dannyb.co/) - Modern Bash CLI framework generator311- [shdoc](https://github.com/reconquest/shdoc) - Documentation generator for shell scripts312313### Security & Advanced Topics314- [Bash Security Best Practices](https://github.com/carlospolop/PEASS-ng) - Security-focused shell script patterns315- [Awesome Bash](https://github.com/awesome-lists/awesome-bash) - Curated list of Bash resources and tools316- [Pure Bash Bible](https://github.com/dylanaraps/pure-bash-bible) - Collection of pure bash alternatives to external commands317318---319320<!-- AGI-INTEGRATION-START -->321322## AGI Framework Integration323324> **Adapted for [@techwavedev/agi-agent-kit](https://www.npmjs.com/package/@techwavedev/agi-agent-kit)**325> Original source: [antigravity-awesome-skills](https://github.com/sickn33/antigravity-awesome-skills)326327### Memory-First Protocol328329Retrieve prior deployment configurations, rollback procedures, and incident post-mortems. Avoid re-discovering infrastructure patterns.330331```bash332# Check for prior infrastructure context before starting333python3 execution/memory_manager.py auto --query "deployment configuration and patterns for Bash Pro"334```335336### Storing Results337338After completing work, store infrastructure decisions for future sessions:339340```bash341python3 execution/memory_manager.py store \342 --content "Deployment pipeline: configured blue-green deployment with health checks on port 8080" \343 --type technical --project <project> \344 --tags bash-pro devops345```346347### Multi-Agent Collaboration348349Broadcast deployment changes so frontend and backend agents update their configurations accordingly.350351```bash352python3 execution/cross_agent_context.py store \353 --agent "<your-agent>" \354 --action "Deployed infrastructure changes — updated CI/CD pipeline with new health check endpoints" \355 --project <project>356```357358### Playbook Integration359360Use the `ship-saas-mvp` or `full-stack-deploy` playbook to sequence this skill with testing, documentation, and deployment verification.361362<!-- AGI-INTEGRATION-END -->