GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo permitir solo ciertos caracteres en una variable Bash?

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

Linux
  1. Bash secuencias de comandos (I)

  2. ¿Asignar solo parte de una cadena a una variable en Bash?

  3. Cómo configurar Chroot SFTP en Linux (Permitir solo SFTP, no SSH)

  4. ¿Cómo eliminar la variable de solo lectura en bash?

  5. ¿Cómo eliminar los caracteres finales en los nombres de archivo en Bash?

Variable de exportación de bash

Bash printf - Cómo imprimir una variable en Bash

Cómo incrementar y decrementar una variable en Bash (Contador)

Cómo personalizar el indicador de Bash Terminal en Debian 10

Cómo establecer la variable de entorno en Bash

¿Cómo puedo verificar los caracteres textuales de una cadena de comando bash?