2017-01-26 46 views
2

巖組:做一個zsh的「如果」,該模式被存儲在一個變量

我有變量名稱和模式,要知道,無論是存儲在NAME字符串存儲在變量模式的glob模式匹配。

例如:

NAME=foobar 
PATTERN='*ob*' 

應該給予匹配。

因爲參數擴張格局發生爲時已晚,我不能做

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

。我可以做的

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

之一,因爲這兩種形式的力$圖案更早擴大。

問:兩種形式哪一種更好?是否有危險(一種PATTERN)會破壞代碼?有沒有更好的方法來編寫這段代碼?

回答

1

我會建議使用$~PATTERN的原因有兩個:

  1. 按照該zsh manpage恰好是${~spec}預期目的:

    ${~spec} 接通GLOB_SUBST選項評估的spec;如果~加倍,請關閉它。設置此選項時,擴展產生的字符串將被解釋爲任何可能的模式,例如文件名擴展和文件名生成以及模式匹配上下文,如條件中=!=運算符的右側。

  2. $=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本身中的錯誤,應該沒有實際上破壞你的代碼的模式,就像做模式匹配以外的事情一樣。應該發生的最糟糕的情況是該模式不正確/格式錯誤,以至於它實際上並不符合其預期目標。

+0

感謝您試用zsh。雖然在我的舊5.1.1版本中碰巧遇到'=',但知道這不是可移植的,我會堅持'〜'。 – user1934428

相關問題