Quiero pedirle al usuario que ingrese una URL, pero solo puede contener A-Z
, a-z
, 0-9
, &
, .
, /
, =
, _
, -
, :
y ?
.
Entonces, por ejemplo:
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.
Esto es lo que se me ocurrió hasta ahora, pero parece que no funciona correctamente:
if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\-\_\/\&\?\:\.\=]* ]]; then
echo "That URL is NOT allowed."
else
echo "That URL is allowed."
fi
Tenga en cuenta que las URL que proporcioné en el ejemplo son solo ejemplos.
Esta secuencia de comandos debe funcionar con todas las entradas posibles del usuario; simplemente no puede contener caracteres distintos a los que especifiqué anteriormente.
Usando bash 3.2.57(1)-release bajo macOS High Sierra 10.13.6.
Respuesta aceptada:
Estuviste cerca.
Desea verificar si la URL contiene al menos uno de los caracteres no permitidos (y luego informarlo como no válido), no al menos uno de los caracteres permitidos.
Puede negar un conjunto de caracteres en una expresión de paréntesis con !
(^
también funciona con bash
y algunas otras conchas).
En cualquier caso, hiciste bien en enumerar explícitamente los caracteres individualmente, usando rangos como a-z
, A-Z
, 0-9
solo funcionaría (al hacer coincidir solo los 26 + 26 + 10 caracteres que enumeró) en la configuración regional C. En otros lugares, podrían coincidir con miles de otros caracteres o incluso cotejar elementos compuestos por más de un carácter (los que clasifican entre A
y Z
como É
por ejemplo para A-Z
).
case $URL in
("" | *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_/\&?:.=-]*)
echo >&2 "That URL is NOT allowed.";;
(*)
echo "That URL is allowed.";;
esac