Skip to content
Back to skills

Bash Scripting Patterns

FSecurity

Bash + shell scripting discipline — strict header (set -euo pipefail; IFS), naming conventions (kebab-case scripts, snake_case functions/vars, SCREAMING_SNAKE_CASE constants), always-quoted variables, defaults via ${var:-default}, getopts for arguments, structured logging to stderr, cleanup via trap, no backticks (use $(cmd)), no eval with user input, no rm -rf on unset vars, ShellCheck strict + shfmt format-check enforced. Auto-fires on shell scripts.

  • 12 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 28, 2026
ai-agentsshellbashnodetestinggitsecurity

Security analysis

F10/100
  • criticalPipes output to a shell interpreter
  • highPerforms destructive filesystem operations
  • criticalDownloads and executes remote scripts — classic supply chain attack
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro shows the line behind each finding and how to fix it

Scanned September 28, 2026

npx -y skills add Nmor/the-claude-council --skill bash-scripting-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bash Scripting Patterns?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Bash Scripting Patterns
[![Security: F — Skills Directory](https://www.skillsdirectory.com/api/skills/nmor-bash-scripting-patterns/badge)](https://www.skillsdirectory.com/skills/nmor-bash-scripting-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
---
name: bash-scripting-patterns
description: Bash + shell scripting discipline — strict header (set -euo pipefail; IFS), naming conventions (kebab-case scripts, snake_case functions/vars, SCREAMING_SNAKE_CASE constants), always-quoted variables, defaults via ${var:-default}, getopts for arguments, structured logging to stderr, cleanup via trap, no backticks (use $(cmd)), no eval with user input, no rm -rf on unset vars, ShellCheck strict + shfmt format-check enforced. Auto-fires on shell scripts.
paths:
  - "**/*.sh"
  - "**/*.bash"
  - "**/*.zsh"
  - "**/.bashrc"
  - "**/.zshrc"
  - "**/.bash_profile"
  - "**/.profile"
---

# bash-scripting-patterns

> **Size budget: 25 KB.** Check: wc -c. Gate: node ~/.claude/scripts/token-budget.mjs --check
>
> Migrated 2026-06-02 from `~/.claude/rules-library/bash/` as part of the lazy-rules-loading plan.
> Phase H will delete the source files.

## Purpose

Shell scripting discipline for every `*.sh` / `*.bash` / `*.zsh` file and every shell rc file. This
page is a routing table only: it names the topic and the file that holds it. Read the row you need —
the guidance, standards, code examples and anti-patterns live in `references/`, so a shell edit pays
for the one concern it touches rather than the whole corpus.

## Routing table

| Topic | Read | What it holds |
| --- | --- | --- |
| **Coding style** | `references/coding-style.md` | Mandatory `set -euo pipefail` header and why each flag; naming table; variable quoting and `${var:-default}`; functions; `getopts` argument parsing; stderr logging; cleanup traps; file-length cap; idioms |
| **No-discards (banned patterns)** | `references/no-discards.md` | The fifteen banned patterns — missing strict mode, unquoted vars, `\|\| true`, backticks, `eval`, unchecked `cd`, `rm -rf` on unset vars, pipe-to-read subshells, `for` over `ls`, hardcoded credentials, `cd -`, mixed `[`/`[[`, unquoted `$@`, `echo` for data, `/bin/bash` shebang — plus `.shellcheckrc`, shfmt flags and the sweep verification block |
| **Patterns** | `references/patterns.md` | Bash-vs-real-language decision table; strict-mode script template; long options via `getopt`; pipeline patterns; retry with backoff; subcommand dispatch; error propagation; config-file loading; the common-pitfalls table |
| **Security** | `references/security.md` | CWE-78 / CWE-77 command injection, CWE-88 argument injection, path traversal, secrets in argv, temp-file races, `umask`, the SUID ban, curl/wget hardening and the `curl \| sh` ban, SSH quoting, secret-free logging, required scanning tooling |
| **Testing** | `references/testing.md` | bats-core idioms; the what-to-test table; mocking external commands and bats-mock; shunit2 for POSIX; coverage via kcov / bashcov; the seven hard rules |
| **Hooks + CI** | `references/hooks.md` | `.githooks/pre-commit` and `pre-push`; the Shell CI workflow with ShellCheck, shfmt, gitleaks, bats and kcov coverage gate; `.editorconfig`; the seven-step pre-push checklist |

## Cross-references

Each reference file carries its own cross-reference list and its own standards citations. The
always-on floor rules that pair with this skill are `~/.claude/rules/common/no-discards.md`,
`no-silent-failures.md`, `verify-before-claim.md` and `no-bloat.md`.

Files in this skill

  • SKILL.md3.2 KB
  • references/coding-style.md5.5 KB
  • references/hooks.md3.9 KB
  • references/no-discards.md6.6 KB
  • references/patterns.md6 KB
  • references/security.md5.3 KB
  • references/testing.md5.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…