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'=')