Tenho problemas para entender a correspondência do padrão de string com =~ em bash .
Eu escrevi a seguinte função (não se assuste - é apenas uma experiência, não uma abordagem de segurança com md5sum):
md5 () {
[[ "$(md5sum $1)" =~ $2* ]] && echo fine || echo baarr;
}
e testei com alguma entrada. Aqui alguma referência:
md5sum wp.laenderliste
b1eb0d822e8d841249e3d68eeb3068d3 wp.laenderliste
É desnecessariamente difícil comparar, se a fonte para a soma de controle não contiver os dois espaços em branco com o nome do arquivo já. É daí que vêm as observações, mas mais interessante do que as muitas maneiras de resolver esse problema foi a minha observação:
Eu defino uma variável de controle e testo minha função com strings muito curtas, mas correspondentes:
ok=b1eb0d822e8d841249e3d68eeb3068d3
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i} ;done
fine
fine
fine
fine
Isso é esperado e bom, já que é o propósito da função, ignorar a incompatibilidade do "wp.laenderliste" ausente e, portanto, incompatibilidades ainda mais longas.
Agora, se eu acrescentar coisas aleatórias, que não correspondem, espero, é claro, erros e os obtenho:
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}GU ;done
baarr
baarr
baarr
baarr
Como esperado. Mas quando há apenas um, último caractere incompatível , veja o que acontece:
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}G ;done
fine
fine
fine
fine
Sou eu, não percebendo como isso deveria funcionar (a seleção está quebrada), ou há realmente um erro de erro por um na correspondência de padrão do bash?
Incompatibilidades no meio da string importam desde a contagem 1:
for i in 5 9 e ; do echo md5 wp.laenderliste ${ok//$i/_} ;done
md5 wp.laenderliste b1eb0d822e8d841249e3d68eeb3068d3
md5 wp.laenderliste b1eb0d822e8d84124_e3d68eeb3068d3
md5 wp.laenderliste b1_b0d822_8d841249_3d68__b3068d3
for i in 5 9 e ; do md5 wp.laenderliste ${ok//$i/_} ;done
fine
baarr
baarr
A versão bash:
bash -version
GNU bash, Version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html>
Isenção de responsabilidade : md5sum é útil apenas contra erros não intencionais, não contra ataques. Eu não incentivo o uso.
E esta questão não é uma busca por melhores soluções ou soluções alternativas. É sobre o Operador =~ , se ele deve agir como age e, em caso afirmativo, por quê.
=~
in ([[ ]]
) é uma correspondência de padrão de expressão regular (ou melhor, uma pesquisa , veja abaixo). Isso é diferente de=
(ou==
) que usa os mesmos padrões dos curingas de nome de arquivo.Em particular, o asterisco em expressões regulares significa "zero ou uma cópia da unidade anterior", portanto,
abc*
significaab
mais zero ou maisc
s.No seu caso, o asterisco à direita torna opcional o caractere final do argumento da função. Em seu exemplo final, o padrão se torna
...68d3G*
, e comoG*
corresponde à string vazia, ele corresponde a uma string como...68d3
. Regexese para "qualquer string" é de.*
, ou "qualquer caractere, qualquer número de vezes".Observe que a correspondência regexp procura uma correspondência em qualquer lugar da string, não precisa ser a string inteira . Portanto, o padrão
cde
seria encontrado na stringabcdefgh
.Você pode querer usar algo assim:
Nós realmente não precisamos de uma correspondência de expressão regular aqui e, como
md5sum
a saída é o espaço à direita (mais o nome do arquivo), podemos usá-lo no padrão para verificar se combinamos com o padrão completo. Portanto, dar à função um hash truncado não corresponderia.Eu não usaria um regex aqui, apenas uma comparação de strings: