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 $path1
contiver 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 path1
e não deve ser citada, pois isso faria com que os operadores regexp (como ^
acima) fossem interpretados literalmente (a menos que você defina a compat31
opção ou set BASH_COMPAT=3.1
).