Me gustaría saber si una cadena $stringcoincidiría con un patrón global $pattern. $stringpuede 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 $stringsería igualado por $pattern1, $pattern2o cualquier otro patrón global arbitraria. Esto es lo que he intentado hasta ahora:
[[ "$string" = $pattern ]]Esto casi funciona, excepto que
$patternse interpreta como un patrón de cadena y no como un patrón global.[ "$string" = $pattern ]El problema con este enfoque es que
$patternse expande y luego se realiza una comparación de cadenas entre$stringy la expansión de$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Este funciona, pero solo si
$stringcontiene un archivo que existe.[[ $string =~ $pattern ]]Esto no funciona porque el
=~operador hace$patternque 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. $stringes la expansión de parámetros. Todo esto se hace en diferentes momentos y por diferentes mecanismos.
caseglobal , 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,barybaz.