Gostaria de dizer se uma string $stringseria correspondida por um padrão glob $pattern. $stringpode ou não ser o nome de um arquivo existente. Como posso fazer isso?
Suponha os seguintes formatos para minhas seqüências de caracteres de entrada:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Eu gostaria de encontrar uma linguagem bash que determina se $stringseria acompanhado por $pattern1, $pattern2ou qualquer outro padrão glob arbitrária. Aqui está o que eu tentei até agora:
[[ "$string" = $pattern ]]Isso quase funciona, exceto que
$patterné interpretado como um padrão de cadeia e não como um padrão glob.[ "$string" = $pattern ]O problema com essa abordagem é que
$patterné expandido e a comparação de cadeias é executada entre$stringe a expansão de$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Este funciona, mas somente se
$stringcontém um arquivo que existe.[[ $string =~ $pattern ]]Isso não funciona porque o
=~operador faz$patterncom que seja interpretado como uma expressão regular estendida, não como um padrão glob ou curinga.
ls /foo/* agora você pode combinar em um
foo/{bar,baz}na verdade é uma expansão entre chaves (não uma expansão de parâmetro) enquanto foo/*é uma expansão de nome de caminho. $stringé expansão de parâmetro. Tudo isso é feito em momentos diferentes e por mecanismos diferentes.
caseinstrução executa Expansão do nome do caminho ("globbing") conforme o manual do Bash.
{bar,baz}não é um padrão. É expansão de parâmetros. A diferença sutil, porém crítica,{bar,baz}é expandida muito cedo em vários argumentos,barebaz.