У меня возникли проблемы с сопоставлением с образцом в функции хука zsh precmd. У меня следующее:
precmd(){
local x='test'
if [ $x = '*test*' ]; then
echo 'hello'
fi
}
который никогда не печатает hello. Я тестировал этот код с обычным кодом, zsh test.zshкоторый работает нормально, и я пробовал без регулярного выражения precmdи получал все, что печаталось нормально. Есть ли какие-нибудь подсказки, почему это не работает так, как ожидалось?
$ zsh --version
zsh 4.3.11 RHEL
решение1
[ $x = '*test*' ]проверяет, равна ли строка, полученная в результате расширения $x, которая textравна , строке, полученной в результате расширения '*test*', которая равна *text*.
xЧтобы проверить, соответствует ли значение переменнойшаблон *test*, вам нужно использовать оператор =or==условные выражения zsh, которые написаны внутридвойные скобки [[ … ]]. Кроме того, специальные символы в шаблоне должны быть без кавычек, в противном случае они обозначают сами себя. Таким образом:
if [[ $x == *test* ]]; then …
Синтаксис условных выражений похож на синтаксис выражений, которые можно использовать в одинарных скобках [ … ], но не идентичен. [анализируется как обычная команда; по сути, это встроенная команда с именем из одного символа, которое идентичноtestвстроенныйза исключением того, что [требуется дополнительный аргумент в конце, который должен быть ]. [[ … ]]— это отдельная грамматическая конструкция, которая позволяет ей иметь внутри специальные символы оболочки. [ $x = *test* ]расширится *test*до списка соответствующих имен файлов (подстановка), и testвстроенная функция в конечном итоге проанализирует результат этого. [[ $x = *test* ]]анализирует *test*как часть условного разбора выражения, который не вызывает подстановку.
решение2
*test*не является допустимым шаблоном регулярного выражения. *Это оператор повторения, и ему нужно что-то повторить. Скорее всего, вам нужно .*test.*, хотя это не обязательно для регулярного выражения, поскольку оно не закреплено по умолчанию. Вы можете просто поискатьtest
Однако вы не можете сопоставлять шаблоны регулярных выражений с =оператором, вам нужен =~.
precmd () {
local x=test
if [[ $x =~ test ]]; then
echo 'hello'
fi
}


