【发布时间】:2019-03-11 17:03:46
【问题描述】:
我正在尝试获取一个 case 语句来匹配 Bash/Zsh shell 中的四个输入之一:
- v
- -v
- 版本
- --版本
我在下面的案例陈述中寻找这个:
case "$1" in
?(--)version|?(-)v)
# do stuff
;;
esac
我发现这行不通。根据我的阅读, ?(pattern) 是如何匹配 0 次或 1 次出现的模式。
我确实通过匹配案例让它工作了
--version|version|-v|v)
但如果有一些更整洁的东西会很好,另外,这是一种学习体验!
我想这可能是因为我没有正确转义,但我也尝试将我的原始字符串包含在双引号 (") 中,但我又没有得到任何输出。
有什么建议吗?
【问题讨论】:
-
嗨,大卫,您是否尝试过启用扩展通配符?在case语句之前运行该命令
shopt -s extglob -
虽然我为你想扩展你的知识而鼓掌,但我只想指出可读性比漂亮更有用。我们可以想出一条超短线。然而,随着时间的推移,这条线很可能会变得难以理解,而且完全无法调试。您可能会花 1 小时了解原因,然后用原来的干净线替换它。始终使用 KISS 原则(保持简单愚蠢)
-
@monok 看起来可行!虽然,这是我正在编写的脚本的 zsh 和 bash 版本之间的额外差异(出于维护目的,我希望它们尽可能接近相同!)。我确实发现
(|--)version有效! @kvantour,这是一个合理的评论,我可能会采用这种方法。谢谢两位! -
IMO,编写兼容在 bash 和 zsh 下运行的脚本没有多大意义。它只适用于相当简单的情况,因为这些语言有很多差异。
-
这是一个中肯的评论,但到目前为止,在我的用例中,我遇到的唯一区别是在 =~ 之后采购 RegEx 匹配项(BASH_REMATCH 与匹配项)。
标签: bash shell pattern-matching zsh glob