GNU/Linux >> Znalost Linux >  >> Linux

Jak povolit pouze určité znaky v proměnné Bash?

Chci vyzvat uživatele, aby zadal URL, ale může obsahovat pouze A-Z , a-z , 0-9 , & , . , / , = , _ , - , : a ? .

Takže například:

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.

Zatím jsem na to přišel, ale zdá se, že to nefunguje správně:

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

Upozorňujeme, že adresy URL, které jsem uvedl v příkladu, jsou pouze příklady.
Tento skript musí pracovat se všemi možnými uživatelskými vstupy; prostě nemůže obsahovat jiné znaky než ty, které jsem uvedl dříve.

Používání bash 3.2.57(1) – vydání pod macOS High Sierra 10.13.6.

Přijatá odpověď:

Byli jste blízko.

Chcete zkontrolovat, zda adresa URL obsahuje alespoň jeden z nepovolených znaků (a poté ji nahlásit jako neplatnou), nikoli alespoň jeden z povolených znaků.

Znakovou sadu ve výrazu hranatých závorek můžete negovat pomocí ! (^ funguje také s bash a několik dalších mušlí).

V každém případě jste měli pravdu, když jste výslovně uvedli znaky jednotlivě pomocí rozsahů jako a-z , A-Z , 0-9 by fungovalo pouze (při shodě pouze s 26+26+10 znaky, které jste uvedli) v národním prostředí C. V jiných jazycích by se mohly shodovat s tisíci dalších znaků nebo dokonce porovnávat prvky složené z více než jednoho znaku (ty, které řadí mezi A a Z jako É například pro A-Z ).

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

Linux
  1. Jak povolit pouze konkrétním uživatelům bez oprávnění root používat crontab

  2. Jak mohu zkontrolovat doslovné znaky řetězce příkazu bash?

  3. Jak omezit uživatele SSH, aby povolil pouze tunelování SSH?

  1. Jak napsat smyčku v Bash

  2. Jak hromadně kopírovat obrázky pouze určité velikosti v Linuxu

  3. Bash skriptování (I)

  1. Přiřadit pouze část řetězce k proměnné v Bash?

  2. Jak nastavit Chroot SFTP v Linuxu (povolit pouze SFTP, ne SSH)

  3. Jak otestuji, zda je proměnná číslo v Bash?