【问题标题】:Conditional Characters in Shell Globbing - Bash/ZshShell Globbing 中的条件字符 - Bash/Zsh
【发布时间】:2019-03-11 17:03:46
【问题描述】:

我正在尝试获取一个 case 语句来匹配 Bash/Zsh shell 中的四个输入之一:

  1. v
  2. -v
  3. 版本
  4. --版本

我在下面的案例陈述中寻找这个:

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


【解决方案1】:

要对此提供答案,最好的解决方案(如果坚持使用某种形式的通配符)是:

(|--)version|(|-)v )

但正如@kvantour 正确指出的那样,坚持使用更简单的方法要好得多:

--version|version|-v|v )

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多