岩组:
我有变量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)?是否有更好的方法来编写此代码?
答案 0 :(得分:2)
我建议使用$~PATTERN
有两个原因:
根据zsh manpage完全是${~spec}
的目的:
<强>
${~spec}
强> 打开GLOB_SUBST
选项以评估spec
;如果~
加倍,请将其关闭。设置此选项后,扩展产生的字符串将在任何可能的位置解释为模式,例如在文件名扩展和文件名生成以及模式匹配上下文(如=
和{的右侧) {1}}运营商的条件。
!=
实际上似乎不适用于您的示例。如果我在我的机器上运行以下命令(zsh-5.3.1):
$=PATTERN
我只得到以下输出:
NAME=foobar
PATTERN='*ob*'
[[ $NAME == ${=PATTERN} ]] && echo '= does the trick'
[[ $NAME == ${~PATTERN} ]] && echo '~ does the trick'
关于可能的危险:除非 zsh 本身存在任何错误,否则应该没有实际破坏代码的模式,就像执行模式匹配之外的其他操作一样。应该发生的最糟糕的情况是模式不正确/格式错误,因此它实际上与预期目标不匹配。