Community程式設計與開發github.com

Jamie-BitFlight/bash-development

當使用者要求「撰寫 bash 腳本」、「建立 shell 腳本」、「實作 bash 函式」、「在 bash 中解析引數」、「在 bash 中處理錯誤」,或提及 bash 開發、shell 腳本、腳本模板或現代 bash 模式時,應使用此技能。

bash-development 是什麼?

此技能為 Bash 5.1 以上版本的腳本開發提供核心模式與最佳實務。它涵蓋現代 bash 慣用語法、穩固的錯誤處理、標準化的引數解析,以及純 bash 替代外部指令的實用技巧。技能內容包括腳本標頭設定(set -euo pipefail)、基於 trap 的錯誤處理、變數引用與唯讀宣告的最佳做法、純 bash 字串操作(取代 sed/awk)、陣列與關聯陣列的安全操作、檔案讀取與條件檢查、以及使用 [[ ]] 與 (( )) 進行條件判斷。此外,還提供了完整的腳本範本與可重複使用的工具函式參考檔案(如 bash_example_file.sh、pure-bash-bible-*),協助開發者快速產出健全、可維護且高效的 bash 腳本。此技能適用於 Claude Code、Cursor、Codex 等 AI 代理平台的開發環境。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jamie-BitFlight/claude_skills/tree/main/plugins/bash-development/skills/bash-development

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Bash 開發

Bash 5.1+ 腳本開發的核心模式與最佳實務。提供現代 bash 慣用語法、錯誤處理、引數解析,以及純 bash 替代外部指令的方法。

腳本基礎

每個腳本都從必要的標頭開始:

#!/usr/bin/env bash
set -euo pipefail

set 選項說明:

  • -e - 指令失敗時立即退出
  • -u - 將未設定變數視為錯誤
  • -o pipefail - 管線中任一指令失敗則整個管線失敗

腳本中繼資料模式

SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly SCRIPT_VERSION="1.0.0"
readonly SCRIPT_NAME SCRIPT_DIR

錯誤處理

實作基於 trap 的錯誤處理,讓腳本更穩健。

程式碼範例

引數解析

標準的引數解析模板。

程式碼範例

變數最佳做法

永遠使用大括號並引用變數:

# 正確
"${variable}"
"${array[@]}"

# 錯誤
$variable
${array[*]}  # 請使用 [@] 以正確迭代

使用 readonly 宣告常數:

readonly CONFIG_FILE="/etc/app/config"
readonly -a VALID_OPTIONS=("opt1" "opt2" "opt3")

注意: 永遠不要在來源腳本(sourced scripts)中使用 readonly,否則重新載入時會產生錯誤。

字串操作(純 Bash)

優先使用 bash 原生參數擴展,而非外部工具:

# 去除前後空白
trimmed="${string#"${string%%[![:space:]]*}"}"
trimmed="${trimmed%"${trimmed##*[![:space:]]}"}"

# 小寫/大寫(Bash 4+)
lower="${string,,}"
upper="${string^^}"

# 子字串提取
substring="${string:0:10}"      # 前 10 個字元
suffix="${string: -5}"          # 最後 5 個字元

# 取代模式
replaced="${string//old/new}"   # 全部取代
replaced="${string/old/new}"    # 取代第一個

# 去除前綴/後綴
no_prefix="${string#prefix}"    # 最短匹配
no_prefix="${string##*/}"       # 最長匹配(basename)
no_suffix="${string%suffix}"    # 最短匹配
no_suffix="${string%%/*}"       # 最長匹配

陣列操作

# 宣告
declare -a indexed_array=()
declare -A assoc_array=()

# 安全迭代(搭配 nullglob)
shopt -s nullglob
for file in *.txt; do
    process "${file}"
done
shopt -u nullglob

# 陣列長度
length="${#array[@]}"

# 附加元素
array+=("new_element")

# 使用索引迭代
for i in "${!array[@]}"; do
    printf '%d: %s\n' "${i}" "${array[i]}"
done

檔案操作

# 讀取檔案至字串
content="$(<"${file}")"

# 讀取檔案至陣列(Bash 4+)
mapfile -t lines < "${file}"

# 檢查檔案狀態
[[ -f "${file}" ]]    # 一般檔案存在
[[ -d "${dir}" ]]     # 目錄存在
[[ -r "${file}" ]]    # 可讀取
[[ -w "${file}" ]]    # 可寫入
[[ -x "${file}" ]]    # 可執行
[[ -s "${file}" ]]    # 非空

# 安全建立暫存檔
temp_file=$(mktemp)
trap 'rm -f "${temp_file}"' EXIT

條件表達式

使用 [[ ]] 進行條件判斷(bash 特有,功能更強大):

# 字串比較
[[ "${var}" == "value" ]]       # 相等
[[ "${var}" == pattern* ]]     # Glob 匹配
[[ "${var}" =~ ^regex$ ]]      # 正規表達式匹配

# 數值比較
(( num > 10 ))                  # 算術比較
[[ "${num}" -gt 10 ]]          # 傳統語法

# 複合條件
[[ -f "${file}" && -r "${file}" ]]
[[ "${opt}" == "a" || "${opt}" == "b" ]]

工具函式

程式碼範例

效能指南

  • 儘可能使用內建指令,而非外部指令
  • 大量資料時使用批次操作,避免迴圈
  • 使用 printf 而非 echo,以獲得更好的可移植性與控制力
  • 在緊湊迴圈中避免不必要的子 shell
  • 字串比較時使用 [[ ]] 而非 [ ]

其他資源

參考檔案

如需詳細模式與範例:

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Jamie-BitFlight/agentskill-kaizen-meta-docs

Agentskill kaizen plugin documentation index. Load when needing to read about cross-platform notes, improvement plans, or DuckDB integration.

Jamie-BitFlight/bash-51-features

Bash 5.1 release features and improvements with practical examples. Use when working with Bash 5.1 features, epoch time variables, redirection enhancements, or when user asks about Bash 5.1 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-52-features

Bash 5.2 release features and improvements with practical examples. Use when working with Bash 5.2 features, variable handling enhancements, readline improvements, or when user asks about Bash 5.2 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-53-features

Bash 5.3 release features and improvements with practical examples. Use when working with Bash 5.3 features, new command substitution, GLOBSORT, loadable builtins, or when user asks about Bash 5.3 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-lint

This skill should be used when the user asks to "lint bash script", "run shellcheck", "format shell script", "use shfmt", "fix shellcheck errors", or mentions shell script linting, formatting, code quality, or pre-commit hooks for bash.

Jamie-BitFlight/bash-logging

This skill should be used when the user asks to "add logging to bash script", "colorize output", "implement log levels", "CI/CD sections", "terminal colors in bash", or mentions logging functions, emoji output, collapsible CI sections, or shlocksmith.

Jamie-BitFlight/bash-portability

This skill should be used when the user asks about "POSIX compatibility", "portable shell scripts", "cross-shell compatibility", "bashisms", "shebang selection", or mentions writing scripts that work on different shells (bash, sh, dash, zsh) or different systems.

Jamie-BitFlight/bash-testing

This skill should be used when the user asks to "test bash script", "write shell tests", "use shunit2", "use shellspec", "create test suite for bash", or mentions unit testing, test frameworks, mocking, or test-driven development for shell scripts.

Jamie-BitFlight/brainstorming-skill

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or when users request help with ideation, marketing, and strategic planning. Explores user intent, requirements, and design before implementation using research-validated prompt patterns.

Jamie-BitFlight/clang-format

Configure clang-format code formatting. Use when: user mentions clang-format or .clang-format, analyzing code style/patterns, creating/modifying formatting config, troubleshooting formatting, brace styles/indentation/spacing/alignment/pointer alignment, or codifying conventions.

Jamie-BitFlight/commitlint

When setting up commit message validation for a project. When project has commitlint.config.js or .commitlintrc files. When configuring CI/CD to enforce commit format. When extracting commit rules for LLM prompt generation. When debugging commit message rejection errors.

Jamie-BitFlight/conventional-commits

When writing a git commit message. When task completes and changes need committing. When project uses semantic-release, commitizen, git-cliff. When choosing between feat/fix/chore/docs types. When indicating breaking changes. When generating changelogs from commit history.

Jamie-BitFlight/dasel-reference

Use when querying, modifying, or converting JSON, YAML, TOML, XML, CSV, HCL, or INI with dasel v3. Complete reference for selectors, functions, conditionals, variables, spread operator, type casting, and format-specific patterns.

Jamie-BitFlight/data-exploration

Use when exploring unknown structured data files with dasel v3 — discover schema, list keys, find nested values, sample arrays, identify data types across JSON, YAML, TOML, XML, CSV, HCL, INI formats

Jamie-BitFlight/data-transformation

Use when modifying, converting, or transforming structured data with dasel v3 — in-place mutations, format conversion, batch operations, array manipulation, object construction, and merge patterns across JSON, YAML, TOML, XML, CSV, HCL, INI

Jamie-BitFlight/delegate

Decompose substantive work into phases, dispatch each phase to a sub-agent, and adjudicate what comes back. Use whenever a request asks for implementation, investigation, a fix, a review, or any change to files — including small ones — and whenever you are about to read source or run a diagnostic yourself instead of handing it off. Also use when a report from a sub-agent needs judging, when a phase needs re-dispatching, or when a user names one instance of a pattern. Does not apply when your own prompt begins "Your ROLE_TYPE is sub-agent." — then follow references/sub-agent-contract.md instead.

Jamie-BitFlight/enterprise-hibernate-hbm

Dasel v3 query patterns for Hibernate .hbm.xml mapping files — entity-table binding, Java property-to-column extraction, one-to-many set/list/bag relationship tracing, many-to-one foreign key discovery, batch scanning across 60+ HBM files. Use when querying Hibernate ORM class mappings, extracting schema metadata from Java persistence layer, or auditing entity-column relationships in enterprise legacy codebases.

Jamie-BitFlight/enterprise-installanywhere

Dasel v3 query patterns for InstallAnywhere .iap_xml installer definitions — use when querying action sequences, discovering variables, resolving platform conditions, navigating panels, or comparing installer variants. Files are 2.5+ MB, 65,000+ lines — too large for context reads, requires structural dasel queries.

Jamie-BitFlight/enterprise-maven-pom

Dasel v3 selector patterns for Maven POM XML files — use when querying dependency versions, filtering by groupId or scope, extracting module hierarchy from parent POMs, or detecting version conflicts across enterprise multi-module Java projects. Load this skill when working with pom.xml files using dasel.

Jamie-BitFlight/enterprise-spring-xml

Dasel v3 selectors for Spring bean factory XML — use when querying any Spring ApplicationContext XML for bean discovery, dependency wiring, JMS destination mapping, property injection extraction, or cross-bean reference tracing. Load this skill before writing dasel selectors against Spring bean XML files (applicationContext.xml, *_beans.xml, spring-*.xml).

相關技能