gpt4 book ai didi

zsh - 执行 zsh 'if',其中模式存储在变量中

转载 作者:行者123 更新时间:2023-12-04 19:41:33 26 4
gpt4 key购买 nike

Zsh:

我有变量 NAME 和 PATTERN,想知道存储在 NAME 中的字符串是否与存储在变量 PATTERN 中的 glob-pattern 匹配。

例如:

NAME=foobar
PATTERN='*ob*'

应该匹配。

我不能做
[[ $NAME == $PATTERN ]] && ...

因为 PATTERN 的参数扩展发生得太晚了。我 可以 做其中之一
[[ $NAME == ${=PATTERN} ]] && ...
[[ $NAME == $~PATTERN ]] && ...

因为这两种形式都强制 $PATTERN 提前扩展。

问题:两种形式哪个更好?是否存在会破坏代码的危险(一种模式)?有没有更好的方法来编写这段代码?

最佳答案

我建议使用 $~PATTERN有两个原因:

  • 根据 zsh manpage正是 ${~spec} 的预期目的:

    ${~spec} Turn on the GLOB_SUBST option for the evaluation of spec; if the ~ is doubled, turn it off. When this option is set, the string resulting from the expansion will be interpreted as a pattern anywhere that is possible, such as in filename expansion and filename generation and pattern-matching contexts like the right hand side of the = and != operators in conditions.

  • $=PATTERN实际上似乎不适用于您的示例。如果我在我的机器上运行以下命令 (zsh-5.3.1):
    NAME=foobar
    PATTERN='*ob*'
    [[ $NAME == ${=PATTERN} ]] && echo '= does the trick'
    [[ $NAME == ${~PATTERN} ]] && echo '~ does the trick'

    我只得到以下输出:
    ~ does the trick


  • 至于可能的危险:除非 zsh 本身存在任何错误,否则不应该有任何模式实际上破坏您的代码,就像做模式匹配以外的事情一样。应该发生的最坏情况是模式不正确/格式错误,因此它实际上与预期目标不匹配。

    关于zsh - 执行 zsh 'if',其中模式存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41873509/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com