
Tengo problemas con la coincidencia de patrones en la función de enlace de zsh precmd
. Tengo lo siguiente:
precmd(){
local x='test'
if [ $x = '*test*' ]; then
echo 'hello'
fi
}
que nunca imprime hola. Probé este código con un código normal zsh test.zsh
que funciona bien, lo intenté sin la expresión regular precmd
y conseguí que las cosas se imprimieran bien también. ¿Alguna pista de por qué esto no funciona como se esperaba?
$ zsh --version
zsh 4.3.11 RHEL
Respuesta1
[ $x = '*test*' ]
prueba si la cadena resultante de la expansión $x
, que es text
, es igual a la cadena resultante de la expansión '*test*'
, que es *text*
.
Para probar si el valor de la variable x
coincide con elpatrón *test*
, es necesario utilizar el operador =
o ==
deexpresiones condicionales zsh, que están escritos dentrosoportes dobles [[ … ]]
. Además, los caracteres especiales del patrón no deben estar entre comillas; de lo contrario, se representan por sí mismos. De este modo:
if [[ $x == *test* ]]; then …
La sintaxis de las expresiones condicionales es similar a la sintaxis de las expresiones que puede usar entre corchetes simples [ … ]
, pero no idéntica. [
se analiza como un comando ordinario; de hecho, es un comando integrado con un nombre de un carácter, que es idéntico altest
incorporadoexcepto que [
requiere un argumento adicional al final que debe ser ]
. [[ … ]]
es una construcción gramatical distinta, que le permite tener caracteres especiales de shell en su interior. [ $x = *test* ]
se expandiría *test*
a la lista de nombres de archivos coincidentes (globbing) y la test
función incorporada terminaría analizando el resultado de eso. [[ $x = *test* ]]
analiza *test*
como parte del análisis de expresiones condicionales que no invoca globbing.
Respuesta2
*test*
no es un patrón de expresiones regulares válido. Es *
un operador de repetición y necesita algo para repetir. Es muy probable que quieras .*test.*
, aunque eso no es necesario con expresiones regulares ya que no está anclado de forma predeterminada. Podrías simplemente buscartest
Sin embargo, no puede hacer coincidir patrones de expresiones regulares con el =
operador, necesita =~
.
precmd () {
local x=test
if [[ $x =~ test ]]; then
echo 'hello'
fi
}