使用zsh的zparseopts处理布尔标志时出现错误
解决zsh中zparseopts无法识别命令行参数的问题
你的代码核心问题是调用demo函数时没有传递脚本的命令行参数。函数本身不会自动继承脚本的$@(命令行参数列表),所以zparseopts在函数内部处理的是空参数集合,自然无法识别-v或--verbose选项。
修复后的完整代码
#!/usr/bin/env zsh emulate -L zsh zmodload zsh/zutil function demo() { local verbose_opt zparseopts -D -E -M -- v=verbose_opt -verbose=verbose_opt if (( ${#verbose_opt} )); then echo "Verbose mode is enabled." else echo "Verbose mode is disabled." fi } echo $@ demo "$@" # 关键修改:将脚本的命令行参数传递给demo函数
测试验证
执行修复后的脚本,会得到符合预期的结果:
$ ../zparseoptsTest.zsh # 预期输出“disabled” Verbose mode is disabled. $ ../zparseoptsTest.zsh -v # 预期输出“enabled” -v Verbose mode is enabled. $ ../zparseoptsTest.zsh --verbose # 预期输出“enabled” --verbose Verbose mode is enabled.
补充说明
- 你当前使用的
zparseopts选项(-D/-E/-M)都是正确的:-D会移除已识别的选项,-E允许选项与非选项参数混合,-M支持多字符长选项匹配,无需调整。 - 如果不需要调试用的
echo $@输出,可以直接删除该行。
内容的提问来源于stack exchange,提问作者Kim Silverman
相关产品推荐
相关产品推荐

