2017-01-26 4 views
2

Zsh:Выполнение ЗШ «если», где шаблон хранится в переменной

У меня есть переменные NAME и PATTERN и хотите знать, соответствует ли строка хранится в наименовании Глоб-шаблон, хранящийся в переменной PATTERN ,

Например:

NAME=foobar 
PATTERN='*ob*' 

должен дать матч.

Я не могу сделать

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

, потому что расширение параметр PATTERN происходит слишком поздно. Я может сделать один из

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

потому что обе формы силы $ PATTERN быть расширен ранее.

Вопрос: Какая из двух форм лучше? Есть ли опасность (тип PATTERN), который нарушит код? Может быть, лучший способ написать этот код?

ответ

1

Я предложил бы использовать $~PATTERN по двум причинам:

  1. Согласно zsh manpage именно намеченная цель ${~spec}:

    ${~spec} Включите GLOB_SUBST вариант для оценки от spec; если ~ удваивается, выключите его. Когда этот параметр установлен, строка, возникающая в результате расширения, будет интерпретироваться как шаблон в любом месте, где это возможно, например, в расширении имени файла и создании имен файлов и контекстов сопоставления шаблонов, таких как правая сторона операторов = и != в условиях.

  2. $=PATTERN на самом деле не работает для вашего примера. Если я бегу следующий на моей машине (ЗШ-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. Хотя '=' происходит с wrok на моем старом 5.1.1, хорошо знать, что это не переносимо, и я буду придерживаться '~'. – user1934428

 Смежные вопросы

  • Нет связанных вопросов^_^