GNU/Linux >> Tutoriels Linux >  >> Linux

Comment autoriser uniquement certains caractères dans une variable bash ?

Je souhaite inviter l'utilisateur à saisir une URL, mais elle ne peut contenir que A-Z , a-z , 0-9 , & , . , / , = , _ , - , : , et ? .

Ainsi, par exemple :

Enter URL:
$ http://youtube.com/watch?v=1234df_AQ-x
That URL is allowed.

Enter URL:
$ https://unix.stackexchange.com/$FAKEurl%🍺123
That URL is NOT allowed.

C'est ce que j'ai trouvé jusqu'à présent, mais cela ne semble pas fonctionner correctement :

if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\-\_\/\&\?\:\.\=]* ]]; then
    echo "That URL is NOT allowed."
else
    echo "That URL is allowed."
fi

Veuillez noter que les URL que j'ai fournies dans l'exemple ne sont que des exemples.
Ce script doit fonctionner avec toutes les entrées utilisateur possibles ; il ne peut tout simplement pas contenir de caractères autres que ceux que j'ai spécifiés précédemment.

Utilisation de la version 3.2.57(1) de bash sous macOS High Sierra 10.13.6.

Réponse acceptée :

Vous étiez proche.

Vous souhaitez vérifier si l'URL contient au moins un des caractères non autorisés (puis la signaler comme non valide), et non au moins un des caractères autorisés.

Vous pouvez inverser un jeu de caractères dans une expression entre crochets avec ! (^ fonctionne aussi avec bash et quelques autres coquillages).

Dans tous les cas, vous aviez raison de lister explicitement les caractères individuellement, en utilisant des plages comme a-z , A-Z , 0-9 ne fonctionnerait (en ne faisant correspondre que les 26+26+10 caractères que vous avez répertoriés) dans les paramètres régionaux C. Dans d'autres paramètres régionaux, ils pourraient correspondre à des milliers d'autres caractères ou même assembler des éléments composés de plusieurs caractères (ceux qui trient entre A et Z comme É par exemple pour A-Z ).

case $URL in
  ("" | *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_/\&?:.=-]*)
    echo >&2 "That URL is NOT allowed.";;
  (*)
    echo "That URL is allowed.";;
esac

Linux
  1. Caractères autorisés dans les noms de variables d'environnement Linux

  2. Comment afficher uniquement des lignes différentes à l'aide de diff (bash)

  3. Comment supprimer la variable readonly dans bash ?

  4. Comment supprimer les caractères de fin dans les noms de fichiers dans Bash ?

  5. Comment restreindre un utilisateur SSH pour autoriser uniquement le tunnel SSH ?

Variable d'exportation bash

Bash printf - Comment imprimer une variable dans Bash

Comment incrémenter et décrémenter une variable dans Bash (compteur)

Comment personnaliser l'invite du terminal Bash sur Debian 10

Comment définir une variable d'environnement dans Bash

Comment puis-je vérifier les caractères textuels d'une chaîne de commande bash ?