
Ich habe folgenden Code:
read -p ":" URL
regex='^(https?\:\/\/)?(www\.youtube\.com)\/.+$'
if [[ "$URL" =~ $regex ]]; then
echo "not valid url "
exit
fi
echo 'Init fnction'
Init FUnction
Ich gebe die URL ein:https://www.asdasd.com/watch?v=nD8WpYD_P94
aber das Skript ist nicht so gut wie gültig: Ausgabe:
+ regex='^(https?\:\/\/)?(www\.youtube\.com)\/.+$'
+ [[ https://www.asdasd.com/watch?v=nD8WpYD_P94 =~ ^(https?\:\/\/)?(www\.youtube\.com)\/.+$ ]]
+ sleep 0.5
+ echo 'Init function...'
Init function...
Ich verstehe nicht, wie man eine URL auf YouTube richtig validiert?
Antwort1
Im Inneren [[ ]]
=~
liegt kein negiertes vor =
.
=~
ist ein Operator, der es Ihnen ermöglicht, mit einem regulären Ausdruck zu vergleichen, während =
er nichts mit regulären Ausdrücken zu tun hat. SieheBedingte Konstrukte in Bash, [[
mit seiner =~
Beschreibung dort. Das wichtigste Fragment:
Ein zusätzlicher binärer Operator,
=~
, ist verfügbar, mit derselben Priorität wie==
und!=
. Wenn er verwendet wird, wird die Zeichenfolge rechts vom Operator als erweiterter regulärer POSIX-Ausdruck betrachtet und entsprechend abgeglichen […].
Der Test ist erfolgreich, wenn der reguläre Ausdruck übereinstimmt. Der Ablauf Ihres Skripts ( echo "not valid"
bei einer Übereinstimmung) lässt mich glauben, dass Sie denken, es sei umgekehrt. Sie müssen den Test negieren.
Um Ihren Test zu negieren, platzieren Sie !
vor dem [[
:
if ! [[ "$URL" =~ $regex ]]; then
Alternativ können Sie den Ausdruck innerhalb von negieren [[ ]]
:
if [[ ! "$URL" =~ $regex ]]; then
Lesen Sie außerdem bitteVerständnisIFS= read -r line
und passen Sie read
möglicherweise Ihren Befehl an.