如何检查字符串是否为语法有效的zsh glob模式?
验证zsh中glob模式的有效性
以下是直接利用zsh内置功能验证glob模式语法的方案,支持基本glob和扩展glob两种模式:
基本glob模式验证
通过zsh的glob命令仅检查语法,无需实际匹配文件:
is_valid_glob() { local pattern="$1" # -c选项仅验证模式语法,不执行文件匹配 glob -c -- "$pattern" >/dev/null 2>&1 }
使用示例:
# 有效模式 is_valid_glob 'a*' && echo "基本glob模式有效" # 无效模式(未闭合的方括号) is_valid_glob 'a[' && echo "有效" || echo "基本glob模式无效"
扩展glob模式验证
扩展glob需要先开启extended_glob选项,再执行语法检查:
is_valid_extended_glob() { local pattern="$1" zsh -c "setopt extended_glob noglob; glob -c -- '$pattern'" >/dev/null 2>&1 }
使用示例:
# 有效扩展模式 is_valid_extended_glob 'a*(b|c)' && echo "扩展glob模式有效" # 无效扩展模式(未闭合的括号) is_valid_extended_glob 'a*(b' && echo "有效" || echo "扩展glob模式无效"
在你的tss程序中集成
可以给脚本添加选项(比如--extended)让用户选择模式,再调用对应验证逻辑:
local use_extended=0 zparseopts -D -E e=use_extended extended=use_extended local tag_pattern="$1" if (( use_extended )); then if ! is_valid_extended_glob "$tag_pattern"; then echo "错误:无效的扩展glob模式" >&2 exit 1 fi else if ! is_valid_glob "$tag_pattern"; then echo "错误:无效的基本glob模式" >&2 exit 1 fi fi # 后续业务逻辑处理...
这种方案直接复用zsh自身的glob解析器,语法判断完全和zsh实际执行时一致,不存在兼容性偏差。
内容的提问来源于stack exchange,提问作者Nahoj
相关产品推荐
相关产品推荐

