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