Ich möchte den Benutzer auffordern, eine URL einzugeben, aber sie darf nur A-Z
enthalten , a-z
, 0-9
, &
, .
, /
, =
, _
, -
, :
, und ?
.
Also zum Beispiel:
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.
Folgendes habe ich mir bisher ausgedacht, aber es scheint nicht richtig zu funktionieren:
if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\-\_\/\&\?\:\.\=]* ]]; then
echo "That URL is NOT allowed."
else
echo "That URL is allowed."
fi
Bitte beachten Sie, dass die URLs, die ich im Beispiel angegeben habe, nur Beispiele sind.
Dieses Skript muss mit allen möglichen Benutzereingaben funktionieren; Es darf nur keine anderen Zeichen enthalten als die, die ich zuvor angegeben habe.
Verwendung von Bash 3.2.57(1)-Release unter macOS High Sierra 10.13.6.
Akzeptierte Antwort:
Du warst nah dran.
Sie möchten prüfen, ob die URL mindestens eines der unzulässigen Zeichen enthält (und es dann als ungültig melden), nicht mindestens eines der zulässigen Zeichen.
Sie können einen Zeichensatz in einem Klammerausdruck mit !
negieren (^
funktioniert auch mit bash
und ein paar andere Muscheln).
Auf jeden Fall war es richtig, Zeichen explizit einzeln aufzulisten, indem Sie Bereiche wie a-z
verwenden , A-Z
, 0-9
würde nur im C-Gebietsschema funktionieren (wenn nur die von Ihnen aufgelisteten 26 + 26 + 10 Zeichen abgeglichen werden). In anderen Gebietsschemas könnten sie mit Tausenden anderer Zeichen übereinstimmen oder sogar Elemente sortieren, die aus mehr als einem Zeichen bestehen (diejenigen, die zwischen A
und Z
wie É
zum Beispiel für A-Z
).
case $URL in
("" | *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_/\&?:.=-]*)
echo >&2 "That URL is NOT allowed.";;
(*)
echo "That URL is allowed.";;
esac