Isso está sintaticamente errado:
#!/usr/bin/env bash
dimension="4x5"
if [[ "$dimension" !=~ '[0-9]x[0-9]' ]]; then
echo 'wtf meng, the dimension needs an "x" in it.'
return 1;
fi
o acima tem uma sintaxe ruim ... então minha pergunta é - existe uma maneira de fazer!=~
... Eu estou supondo que é !~
? Se isso for verdade, chega de regras de negação lulz. Bom testei e !~
também não funcionou..
Não há operadores
!=~
ou para a palavra- chave. Em vez disso, negue o resultado da comparação:!~
[[
Sobre citar o
regex
argumento, o manual afirma:Portanto, partes de expressões regulares do
regex
não devem ser citadas - a menos que a opção shellcompat31
esteja definida:Para o exemplo dado, tente:
regex
deve ser ancorado com^...$
, caso contráriofoo1x1fubar
seria considerado uma dimensão válida.Lembre-se também de não usar intervalos como
0-9
para validação de entrada, especialmente se for para sanitização em contextos sensíveis à segurança, pois em muitos locais, esses intervalos incluem muito mais caracteres (ou possivelmente elementos de agrupamento feitos de vários caracteres) do que historicamente (e ainda faz na localidade C/POSIX).Para
=~
,bash
'sglobasciiranges
não ajuda aqui. No Ubuntu 19.10 e naen_GB.UTF-8
localidade, acho que correspondebash
a[0-9]
1040 caracteres diferentes, além de 0123456789, com ou semglobasciiranges
. Pelo menos no meu caso todos eles têm alguma relação com os dígitos decimais de 0 a 8, mas isso nem é garantido em geral.Por outro lado,
[[:digit:]]
e[0123456789]
corresponde apenas aos 10 e deve em qualquer sistema compatível com POSIX.Você também pode fazer isso usando
sh
sintaxe padrão e padrões curinga com algo como:Ou com ksh globs (como também suportado por
bash -O extglob
andbash
's[[
even withoutextglob
) com:Tudo bem, então isso parece funcionar:
mas estou me perguntando por que envolvê-lo entre aspas simples não funciona:
aqui está minha solução:
Agora você pode usar aspas simples para citar a regex, mas deve evitar as aspas duplas ao fazer referência a $regex de dentro de [[ ]]. No entanto, ainda estou curioso para saber se existe uma abreviação para
[0-9]+
..