在zsh中如何测试任意字符串是否匹配glob模式?
在zsh中测试字符串匹配glob模式(独立于文件路径)
没问题!zsh完全支持脱离文件路径来测试字符串是否匹配glob模式,不过确实没有内置的testglob命令,但咱可以自己搞定,甚至还能模拟出你想要的testglob用法~
方法1:直接用zsh原生条件表达式测试
zsh的[[ ... ]]条件结构是专门做这类字符串判断的,用==操作符就能实现纯字符串的glob匹配,完全不涉及文件系统——它就是单纯的字符串比对。
举个实际例子,比如你要测试字符串是否以s开头(对应你提到的s*模式):
# 测试匹配的情况 if [[ "string_that_matches" == s* ]]; then echo "匹配成功" else echo "匹配失败" fi # 测试不匹配的情况 if [[ "does_not_match" == s* ]]; then echo "匹配成功" else echo "匹配失败" fi
要是你需要更复杂的glob语法(比如取反、分组),可以先开启extended_glob选项(setopt extended_glob),这样就能用^pattern(匹配不满足模式的字符串)、(a|b)(匹配a或b)这类高级写法了。
方法2:自定义testglob命令
如果你想要一个像testglob那样的独立命令,直接写个zsh函数就行,非常简单:
testglob() { # 先检查参数是否正确 if [[ $# -ne 2 ]]; then echo "用法:testglob <glob模式> <待测试字符串>" return 2 fi local pattern="$1" local string="$2" # 开启扩展glob支持更多语法 setopt extended_glob # 执行匹配判断,返回对应状态码 [[ "$string" == $pattern ]] }
之后用法就完全符合你的预期了:
# 测试匹配的情况,执行后用echo $?看返回值,0表示匹配成功 testglob 's*' 'string_that_matches' echo $? # 输出0 # 测试不匹配的情况,返回1表示失败 testglob 's*' 'does_not_match' echo $? # 输出1
关于添加内置testglob的可能性
zsh是开源项目,如果你觉得内置这个命令能带来便利,可以去zsh的官方代码仓库提交功能请求或者补丁。不过考虑到zsh已经提供了原生的条件表达式和灵活的自定义函数能力,大部分用户靠自定义函数就能满足需求,所以内置这个命令的优先级可能不高,但你完全可以发起讨论看看社区的想法~
内容的提问来源于stack exchange,提问作者sasquires
相关产品推荐
相关产品推荐

