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