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