Teste Bash: o que “= ~” faz?

27
#!/bin/bash
INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

echo "INT is an integer."

else

echo "INT is not an integer." >&2

exit 1

fi

O que o líder ~ faz na expressão regular inicial?

    
por ragnarok 27.01.2017 / 02:02

2 respostas

37

O ~ é, na verdade, parte do operador =~ , que executa uma correspondência de expressão regular da sequência à sua esquerda para a expressão regular estendida à direita.

[[ "string" =~ pattern ]]

Observe que a string deve ser citada e que a expressão regular não deve ser citada.

Um operador similar é usado na linguagem de programação Perl.

As expressões regulares compreendidas por bash são as mesmas que o GNU grep entende com o -E , ou seja, o conjunto estendido de expressões regulares.

Um pouco fora do assunto, mas é bom saber:

Ao corresponder a uma expressão regular contendo grupos de captura, a parte da string capturada por cada grupo está disponível na matriz BASH_REMATCH . O zeroth / primeira entrada neste array corresponde a & no padrão de substituição do comando de substituição sed (ou $& em Perl), que é o bit da string que corresponde ao padrão, enquanto as entradas em o índice 1 em diante corresponde a , , etc. em um padrão de substituição sed (ou $1 , $2 etc. em Perl), isto é, os bits correspondidos por cada parêntese.

Exemplo:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

Isso pode produzir

Got 09, 19 and 14

se a hora atual for 09:19:14.

O REMATCH do nome da matriz BASH_REMATCH vem de "Correspondência de expressões regulares", ou seja, "RE-Match".

Em não- bash shells parecidos com Bourne, também é possível usar expr para correspondência de expressão regular limitada (usando apenas expressões regulares básicas).

Um pequeno exemplo:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
    
por 27.01.2017 / 09:28
2

Você deve ler as páginas man bash, sob a seção [[ expression ]] .

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).

História longa, =~ é um operador, assim como == e != . Não tem nada a ver com o real regex na string à sua direita.

    
por 27.01.2017 / 04:14

Tags