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单元集成测试