web-dev-qa-db-fra.com

Bash considère toujours que Regex est vrai

Dans un script, il y a ces lignes

#!/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

Le problème est que, quelle que soit la valeur définie sur $SCREEN_NAME, le script se termine toujours avec ce message. J'ai essayé de lire des expressions régulières avec Bash et je n'y vois aucun inconvénient. Qu'est-ce que je rate?

Mise à jour

Après les commentaires et les réponses, je me suis fait l'écho de $SCREEN_NAME, et rien ne semblait mal se passer… jusqu'à ce que je le fasse

echo "*$SCREEN_NAME*"

et vu que le deuxième astérisque a été mis sur une nouvelle ligne. Voici comment $SCREEN_NAME est défini:

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

La valeur est lue à partir du fichier de configuration de type INI. La ligne intéressante est

server_screen_title=Test-Server

Et je crois que la valeur contient le caractère final \n. Ainsi, le test échoue. J'ai lu man pour cut, mais je ne sais pas comment résoudre ce problème, ni si j'ai raison sur celui-ci.

5
Yanick Rochon

J'ai été trop rapide sur celui-ci, votre test fonctionne. Je suppose que vous avez en quelque sorte défini $SCREEN_NAME globalement ou précédemment dans le script en tant que chaîne contenant un caractère illégal.

^[a-zA-Z0-9_.-]+$ correspond à une chaîne non NULL contenant uniquement les caractères autorisés. Par conséquent, si $SCREEN_NAME est une chaîne non NULL contenant uniquement les caractères autorisés, la valeur de $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ est 0.

! inverse sa valeur, donc si $SCREEN_NAME est une chaîne non NULL contenant uniquement les caractères autorisés, la valeur de ! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]] est égale à 1.

Donc, la condition est ok.

Exécutez echo $SCREEN_NAME dans bash et dans votre script et vérifiez si la sortie réelle correspond à ce qui est attendu.

Edit: Pour supprimer le retour de fin de chaîne, une solution consiste à canaliser la sortie de grep vers tr avant cut:

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | tr -d '\r' | cut -f2 -d'=')
3
kos