POSIXShell兼容性验证器Skill posix-shell-validator

POSIX Shell 兼容性验证器是一个专门用于检测和验证Shell脚本POSIX标准兼容性的工具。它能够识别脚本中的bashism(Bash特有语法),检查跨平台可移植性,并提供符合POSIX标准的替代方案。该工具适用于Shell脚本开发、跨平台部署前的兼容性检查、CLI工具开发等场景,帮助开发者编写更通用、更可移植的Shell脚本。 关键词:POSIX兼容性, Shell脚本验证, bashism检测, 跨平台脚本, 可移植性检查, Shell脚本测试, CLI兼容性, 脚本标准化, 脚本质量检查, 自动化验证

DevOps 0 次安装 1 次浏览 更新于 2/23/2026

name: posix-shell-validator description: 验证脚本的POSIX兼容性,进行可移植性检查、bashism检测和跨平台兼容性验证。 allowed-tools: 读取, 写入, 编辑, Bash, Glob, Grep

POSIX Shell 验证器

验证脚本的POSIX兼容性和可移植性。

功能

  • 检测shell脚本中的bashism
  • 验证POSIX兼容性
  • 检查跨平台兼容性
  • 识别非可移植结构
  • 生成兼容性报告
  • 建议可移植替代方案

使用场景

在以下情况调用此技能:

  • 验证脚本的POSIX兼容性
  • 部署前检测bashism
  • 确保跨平台兼容性
  • 生成兼容性报告

应避免的常见Bashism

# Bashism → POSIX替代方案

# 数组
arr=(a b c)           # 使用: set -- a b c; 或换行分隔
${arr[0]}             # 使用: $1 (在set --之后)

# [[ ]] 测试
[[ $x == y ]]         # 使用: [ "$x" = "y" ]
[[ $x =~ regex ]]     # 使用: case 或 expr

# 字符串替换
${var/old/new}        # 使用: $(echo "$var" | sed 's/old/new/')
${var,,}              # 使用: $(echo "$var" | tr '[:upper:]' '[:lower:]')
${var^^}              # 使用: $(echo "$var" | tr '[:lower:]' '[:upper:]')

# 算术运算
((x++))               # 使用: x=$((x + 1))
$((x**2))             # 使用: $(expr $x \* $x) 或 awk

# Here字符串
cat <<< "$var"        # 使用: echo "$var" | cat

# 进程替换
diff <(cmd1) <(cmd2)  # 使用: 临时文件

# 花括号展开
{1..10}               # 使用: seq 1 10
file.{txt,md}         # 使用: file.txt file.md

# 局部变量
local var             # 使用: var= (在许多shell中函数作用域)

# 源文件
source file           # 使用: . file

# 函数语法
function name { }     # 使用: name() { }

验证脚本

#!/bin/sh
# POSIX兼容性验证器

check_file() {
    file="$1"
    errors=0

    # 检查shebang
    head -1 "$file" | grep -q '^#!/bin/bash' && {
        echo "警告: $file 使用bash shebang"
        errors=$((errors + 1))
    }

    # 检查bashism
    bashisms='
        \[\[
        \(\(
        \$\{[^}]*//
        \$\{[^}]*,,
        \$\{[^}]*\^\^
        \$\{[^}]*:[-+=?][^}]*\}
        <<<
        <\(
        >\(
        \{[0-9]+\.\.[0-9]+\}
        function[[:space:]]+[a-zA-Z_]
        source[[:space:]]
        declare[[:space:]]
        local[[:space:]]
        readonly[[:space:]]
    '

    for pattern in $bashisms; do
        if grep -En "$pattern" "$file" 2>/dev/null; then
            echo "BASHISM: $file 包含: $pattern"
            errors=$((errors + 1))
        fi
    done

    return $errors
}

# 如果可用则运行checkbashisms
if command -v checkbashisms >/dev/null 2>&1; then
    checkbashisms -f "$1"
else
    check_file "$1"
fi

目标流程

  • shell脚本开发
  • 跨平台CLI兼容性
  • CLI单元集成测试