Me gustaría saber si una cadena $string
coincidiría con un patrón global $pattern
. $string
puede o no ser el nombre de un archivo existente. ¿Cómo puedo hacer esto?
Asumir los siguientes formatos para mis cadenas de entrada:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Me gustaría encontrar un lenguaje bash que determina si $string
sería igualado por $pattern1
, $pattern2
o cualquier otro patrón global arbitraria. Esto es lo que he intentado hasta ahora:
[[ "$string" = $pattern ]]
Esto casi funciona, excepto que
$pattern
se interpreta como un patrón de cadena y no como un patrón global.[ "$string" = $pattern ]
El problema con este enfoque es que
$pattern
se expande y luego se realiza una comparación de cadenas entre$string
y la expansión de$pattern
.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
Este funciona, pero solo si
$string
contiene un archivo que existe.[[ $string =~ $pattern ]]
Esto no funciona porque el
=~
operador hace$pattern
que se interprete como una expresión regular extendida, no como un patrón global o comodín.
ls /foo/*
ahora puedes igualar en un
foo/{bar,baz}
realidad es una expansión de llaves (no una expansión de parámetros) mientras que foo/*
es una expansión de nombre de ruta. $string
es la expansión de parámetros. Todo esto se hace en diferentes momentos y por diferentes mecanismos.
case
global , la instrucción realiza la Expansión del nombre de ruta ("globalización") según el manual de Bash.
{bar,baz}
no es un patrón. Es la expansión de parámetros. La diferencia sutil pero crítica{bar,baz}
se expande muy pronto en múltiples argumentos,bar
ybaz
.