Não há solução geral para esse problema. A razão é que, no bash, a expansão de chave (por exemplo, {pattern1,pattern2,...}
e expansão de nome de arquivo (padrões glob) são consideradas coisas separadas e expandidas sob diferentes condições e em diferentes momentos. Aqui está a lista completa de expansões que o bash executa: / p>
- expansão de chave
- expansão de til
- parâmetro e expansão de variáveis
- substituição de comandos
- expansão aritmética
- divisão de palavras
- expansão do nome do caminho
Como nos preocupamos apenas com um subconjunto desses (talvez a expansão de chave, til e caminho), é possível usar certos padrões e mecanismos para restringir a expansão de maneira controlável. Por exemplo:
#!/bin/bash
set -f
string=/foo/bar
for pattern in /foo/{*,foo*,bar*,**,**/*}; do
[[ $string == $pattern ]] && echo "$pattern matches $string"
done
A execução deste script gera a seguinte saída:
/foo/* matches /foo/bar
/foo/bar* matches /foo/bar
/foo/** matches /foo/bar
Isso funciona porque set -f
desabilita a expansão do nome do caminho, portanto, apenas expansão de expansão e expansão de til ocorrem na instrução for pattern in /foo/{*,foo*,bar*,**,**/*}
. Podemos então usar a operação de teste [[ $string == $pattern ]]
para testar a expansão do nome do caminho após a expansão da chave já ter sido executada.