在模式存储在变量中的位置执行zsh'if'

时间:2017-01-26 12:31:10

标签: zsh

岩组:

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

例如:

[[ $NAME == $PATTERN ]] && ...

应该给出一个匹配。

我无法做到

[[ $NAME == ${=PATTERN} ]] && ...
[[ $NAME == $~PATTERN ]] && ...

因为PATTERN的参数扩展发生得太晚了。我可以做一个

interface ComponentProps { }
interface ComponentState {
  name: string
  address: string
}

class MyComponent extends React.Component<ComponentProps, ComponentState> {
  handleChange(e) {
    e.preventDefault()
    this.setState({ [e.target.name]: e.target.value })
  }
}

因为两种形式都迫使$ PATTERN更早地扩展。

问题:两种形式中哪一种更好?是否存在破坏代码的危险(一种PATTERN)?是否有更好的方法来编写此代码?

1 个答案:

答案 0 :(得分:2)

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

  1. 根据zsh manpage完全是${~spec}的目的:

      

    <强> ${~spec}   打开GLOB_SUBST选项以评估spec;如果~加倍,请将其关闭。设置此选项后,扩展产生的字符串将在任何可能的位置解释为模式,例如在文件名扩展和文件名生成以及模式匹配上下文(如=和{的右侧) {1}}运营商的条件。

  2. !=实际上似乎不适用于您的示例。如果我在我的机器上运行以下命令(zsh-5.3.1):

    $=PATTERN

    我只得到以下输出:

    NAME=foobar
    PATTERN='*ob*'
    [[ $NAME == ${=PATTERN} ]] && echo '= does the trick'
    [[ $NAME == ${~PATTERN} ]] && echo '~ does the trick'
    
  3. 关于可能的危险:除非 zsh 本身存在任何错误,否则应该没有实际破坏代码的模式,就像执行模式匹配之外的其他操作一样。应该发生的最糟糕的情况是模式不正确/格式错误,因此它实际上与预期目标不匹配。