Jamie-BitFlight/bash-lint

Cette compétence doit être utilisée lorsque l'utilisateur demande de « linter un script bash », « exécuter shellcheck », « formater un script shell », « utiliser shfmt », « corriger les erreurs shellcheck », ou mentionne le linting de scripts shell, le formatage, la qualité du code ou les hooks pre-commit pour bash.

Qu'est-ce que bash-lint ?

Cette compétence intègre ShellCheck et shfmt pour assurer la qualité des scripts bash. ShellCheck est un outil d'analyse statique qui détecte les erreurs, les problèmes de portabilité et les mauvaises pratiques dans les scripts shell, tandis que shfmt formate automatiquement le code pour une présentation cohérente. La compétence couvre l'installation des deux outils via les gestionnaires de paquets (apt, brew, snap, etc.) et leur utilisation en ligne de commande, avec des exemples de filtrage des règles, de formats de sortie et d'options de formatage. Elle propose également des intégrations avec les hooks pre-commit pour Git, les pipelines CI/CD (GitHub Actions, GitLab CI), les éditeurs (VS Code, Vim/Neovim) et explique en détail les codes ShellCheck les plus courants, les directives de désactivation, ainsi que les bonnes pratiques pour corriger les problèmes fréquents comme le non-respect des guillemets ou la gestion des codes de sortie.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jamie-BitFlight/claude_skills/tree/main/plugins/bash-development/skills/bash-lint

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Linting Bash

Intégration de ShellCheck et shfmt pour l'assurance qualité des scripts bash.

ShellCheck

Installation

# Debian/Ubuntu
apt install shellcheck

# macOS
brew install shellcheck

# Depuis les sources
cabal update && cabal install ShellCheck

Utilisation de base

# Vérifier un seul fichier
shellcheck script.sh

# Vérifier plusieurs fichiers
shellcheck *.sh

# Avec un dialecte shell spécifique
shellcheck --shell=bash script.sh
shellcheck --shell=sh script.sh

# Exclure des règles spécifiques
shellcheck --exclude=SC2086 script.sh
shellcheck --exclude=SC2086,SC2046 script.sh

# Formats de sortie
shellcheck --format=gcc script.sh    # Style GCC
shellcheck --format=json script.sh   # JSON pour les outils
shellcheck --format=diff script.sh   # Diff unifié

Codes ShellCheck courants

CodeProblèmeCorrection
SC2086Guillemets manquants pour éviter le splitting"$var"
SC2046Guillemets pour la substitution de commande"$(cmd)"
SC2006Utiliser $() au lieu des backticks$(cmd)
SC2034Variable semble inutiliséeSupprimer ou exporter
SC2155Déclarer et assigner séparémentSplit local var; var=$(...)
SC2164Utiliser `cd ...
SC2181Vérifier le code de sortie directementif cmd; then
SC2129Envisager de regrouper les écrituresUtiliser { } > file
SC1090Impossible de suivre le fichier sourcéUtiliser # shellcheck source=path
SC2154Variable référencée mais non assignéeInitialiser ou déclarer

Directives ShellCheck

# Désactiver pour la ligne suivante
# shellcheck disable=SC2086
echo $unquoted_var

# Désactiver pour tout le fichier (en haut)
# shellcheck disable=SC2086,SC2046

# Spécifier le fichier source pour le sourcing
# shellcheck source=./lib/functions.sh
source "$SCRIPT_DIR/lib/functions.sh"

# Spécifier le dialecte shell
# shellcheck shell=bash

# Désactiver pour un bloc (non supporté - utiliser par ligne)

Modèles de directives en ligne

# Désactiver un avertissement spécifique avec explication
# shellcheck disable=SC2034 # Variable utilisée par le script source
readonly CONFIG_VERSION="1.0"

# Désactiver plusieurs codes
# shellcheck disable=SC2086,SC2046
result=$(echo $var)

# Directive source pour les chemins dynamiques
# shellcheck source=/dev/null
source "${DYNAMIC_PATH}/config.sh"

shfmt

Installation

# macOS
brew install shfmt

# Installation Go
go install mvdan.cc/sh/v3/cmd/shfmt@latest

# Snap
snap install shfmt

# Téléchargement binaire
# Depuis https://github.com/mvdan/sh/releases

Utilisation de base

# Formater et afficher sur stdout
shfmt script.sh

# Formater sur place
shfmt -w script.sh

# Vérifier le formatage (code de sortie 1 si non formaté)
shfmt -d script.sh

# Répertoire récursif
shfmt -w .
shfmt -w scripts/

Options de formatage

# Indentation
shfmt -i 2 script.sh  # Indentation de 2 espaces
shfmt -i 4 script.sh  # Indentation de 4 espaces
shfmt -i 0 script.sh  # Tabulations (par défaut)

# Opérateurs binaires en début de ligne
shfmt -bn script.sh

# Indentation des cas switch
shfmt -ci script.sh

# Espace après les opérateurs de redirection
shfmt -sr script.sh

# Conserver l'alignement des colonnes
shfmt -kp script.sh

# Accolade d'ouverture de fonction sur une ligne séparée
shfmt -fn script.sh

# Combiné
shfmt -i 4 -ci -bn script.sh

Configuration (.editorconfig)

# .editorconfig
[*.sh]
indent_style = space
indent_size = 4
shell_variant = bash
binary_next_line = true
switch_case_indent = true
space_redirects = true

Exemples de transformations

Avant shfmt :

if [ -f "$file" ];then
echo "exists"
fi

for i in 1 2 3;do
    process $i
done

Après shfmt -i 4 -ci :

if [ -f "$file" ]; then
    echo "exists"
fi

for i in 1 2 3; do
    process $i
done

Intégration Pre-commit

.pre-commit-config.yaml

repos:
  - repo: https://github.com/koalaman/shellcheck-precommit
    rev: v0.9.0
    hooks:
      - id: shellcheck
        args: ["--severity=warning"]

  - repo: https://github.com/scop/pre-commit-shfmt
    rev: v3.7.0-1
    hooks:
      - id: shfmt
        args: ["-i", "4", "-ci", "-w"]

  # Alternative : hooks locaux
  - repo: local
    hooks:
      - id: shellcheck
        name: shellcheck
        entry: shellcheck
        language: system
        types: [shell]
        args: ["--severity=warning", "-x"]

      - id: shfmt
        name: shfmt
        entry: shfmt
        language: system
        types: [shell]
        args: ["-i", "4", "-ci", "-w"]

Exécution de Pre-commit

# Installer les hooks
pre-commit install       # ou : prek install

# Exécuter sur tous les fichiers
pre-commit run --all-files       # ou : prek run --all-files

# Exécuter un hook spécifique
pre-commit run shellcheck --all-files
pre-commit run shfmt --all-files

# Exécuter sur des fichiers spécifiques
pre-commit run --files script.sh

Intégration CI/CD

GitHub Actions

name: Shell Lint

on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run ShellCheck
        uses: ludeeus/action-shellcheck@master
        with:
          severity: warning

      - name: Check formatting with shfmt
        uses: mvdan/github-action-shfmt@master
        with:
          flags: -d -i 4 -ci

GitLab CI

shellcheck:
  image: koalaman/shellcheck-alpine:stable
  script:
    - find . -name "*.sh" -exec shellcheck {} +

shfmt:
  image: mvdan/shfmt:latest
  script:
    - shfmt -d -i 4 -ci .

Correction des problèmes courants

SC2086 : Guillemets pour éviter le splitting

# Mauvais
echo $var

# Bon
echo "$var"
printf '%s\n' "$var"

SC2155 : Déclarer et assigner séparément

# Mauvais - masque le code de sortie
local var=$(some_command)

# Bon
local var
var=$(some_command)

SC2164 : Utiliser cd || exit

# Mauvais
cd "$dir"
rm -rf *

# Bon
cd "$dir" || exit 1
rm -rf *

# Ou avec un sous-shell
(cd "$dir" && rm -rf *)

SC2181 : Vérifier le code de sortie directement

# Mauvais
command
if [ $? -eq 0 ]; then

# Bon
if command; then

SC1090/SC1091 : Problèmes de source

# Ajouter une directive pour la source dynamique
# shellcheck source=/dev/null
source "$DYNAMIC_PATH/lib.sh"

# Ou spécifier le chemin réel
# shellcheck source=./lib/functions.sh
source "$SCRIPT_DIR/lib/functions.sh"

Intégration avec les éditeurs

VS Code

Installer l'extension "ShellCheck" de Timon Wong.

// settings.json
{
    "shellcheck.enable": true,
    "shellcheck.run": "onSave",
    "shellcheck.executablePath": "shellcheck",
    "editor.formatOnSave": true,
    "[shellscript]": {
        "editor.defaultFormatter": "foxundermoon.shell-format"
    }
}

Vim/Neovim

" Avec ALE
let g:ale_linters = {'sh': ['shellcheck']}
let g:ale_fixers = {'sh': ['shfmt']}
let g:ale_sh_shfmt_options = '-i 4 -ci'

" Avec coc.nvim
" Installer l'extension coc-sh

Bonnes pratiques

  1. Exécutez shellcheck tôt - intégrez-le dans l'éditeur et le CI
  2. Corrigez les problèmes, ne les supprimez pas - ne désactivez que pour une bonne raison
  3. Documentez les suppressions - expliquez pourquoi la règle est désactivée
  4. Utilisez les niveaux de sévérité - --severity=warning pour le CI
  5. Formatage cohérent - utilisez shfmt dans pre-commit
  6. Verrouillez les versions des outils - épinglez les versions dans CI/pre-commit

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-development

This skill should be used when the user asks to "write a bash script", "create a shell script", "implement bash function", "parse arguments in bash", "handle errors in bash", or mentions bash development, shell scripting, script templates, or modern bash patterns.

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).

Skills associés