Bash sempre avalia Regex como verdadeiro

5

Em um script, há essas linhas

#!/bin/bash

...

if ! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]]; then
  echo "The Server title contains invalid symbole. Only a-z A-Z 0-9 - _ . are allowed"
  exit 1;
fi

O problema é que, independentemente do valor $SCREEN_NAME ser definido, o script sempre sai com essa mensagem. Eu tentei ler expressões regulares com o Bash, e não vejo nada de errado com isso. O que estou perdendo?

Atualizar

Seguindo comentários e respostas, ecoei $SCREEN_NAME , e nada parecia errado ... até que eu fiz

echo "*$SCREEN_NAME*"

e viu que o segundo asterisco foi colocado em uma nova linha. Veja como $SCREEN_NAME está definido:

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties  | cut -f2 -d'=')

O valor é lido do arquivo de configuração do INI. A linha interessante é

server_screen_title=Test-Server

E acredito que o valor contém o caractere de terminação \n . Assim, o teste falha. Eu li man for cut , mas não sei como consertar isso, nem se estou certo sobre isso.

    
por Yanick Rochon 26.04.2015 / 19:16

1 resposta

3

Eu fui muito rápido com isso, seu teste funciona. Eu suspeito que você tenha definido $SCREEN_NAME globalmente ou anteriormente no script como uma string contendo um caractere ilegal.

^[a-zA-Z0-9_.-]+$ corresponde a uma cadeia não-NULL contendo apenas os caracteres permitidos, portanto, se $SCREEN_NAME for uma cadeia não-NULL contendo apenas os caracteres permitidos, o valor de $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ será 0.

! inverte seu valor, portanto, se $SCREEN_NAME for uma string não-NULL contendo apenas os caracteres permitidos, o valor de ! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]] será 1.

Portanto, a condição é boa.

Execute echo $SCREEN_NAME no bash e seu script e verifique se a saída real corresponde ao esperado.

Editar : Para remover o retorno de carro à direita, uma solução é canalizar a saída de grep para tr antes de cut :

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | tr -d '\r' | cut -f2 -d'=')
    
por kos 26.04.2015 / 19:56