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