Bash: Regex para comparar o caminho do arquivo

Bash: Regex para comparar o caminho do arquivo

Quero verificar se uma string de entrada corresponde aos caminhos de arquivo da lista de permissões, só quero realizar alguma operação.

Estou fazendo algo assim

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Onde, se os caminhos são como

mydir/test/dir
mydir/othertest/dir

Isso deveria passar.

A verificação acima está me dando um erro

assets/bin/copymain: line 8: [: too many arguments

Responder1

Observe que se o único requisito é comparar caminhos/strings que terminam ou começam de determinada maneira, então as expressões regulares não são necessárias:

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

Responder2

path1="mydir/**"
path2="mydir/testing"

Aqui path1="mydir/**"usa um padrão globbing que é uma linguagem totalmente diferente do Extended RegEx usado na comparação.

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Mas as condições usam um RegEx:

[[ "$path2" =~ "$path1" ]]

Não adicione espaços entre o [ [e ] ]mas [[e]]

Globbing de expansão de parâmetros e Regex são duas linguagens de padrões diferentes.

Se $path1contiver o padrão de lista de permissões, você deverá escrevê-lo em RegEx assim:

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

O lado direito é a variável RegEx path1e não deve ser citada, pois isso faria com que os operadores regexp (como ^acima) fossem interpretados literalmente (a menos que você defina a compat31opção ou set BASH_COMPAT=3.1).

informação relacionada