
У меня есть следующий код:
read -p ":" URL
regex='^(https?\:\/\/)?(www\.youtube\.com)\/.+$'
if [[ "$URL" =~ $regex ]]; then
echo "not valid url "
exit
fi
echo 'Init fnction'
Init FUnction
Я ввожу URL:https://www.asdasd.com/watch?v=nD8WpYD_P94
но скрипт не получается как надо: вывод:
+ 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...
Я не понимаю, как правильно проверить URL на YouTube?
решение1
Внутри [[ ]]
=~
не отрицается =
.
=~
— оператор, который позволяет вам сопоставлять с регулярным выражением, при этом =
не имеет ничего общего с регулярными выражениями. СмотритеУсловные конструкции в Bash, [[
с его =~
описанным там. Самый важный фрагмент:
=~
Доступен дополнительный бинарный оператор, , с тем же приоритетом, что==
и!=
. При его использовании строка справа от оператора считается расширенным регулярным выражением POSIX и сопоставляется соответственно […].
Тест проходит успешно, если регулярное выражение совпадает. Поток вашего скрипта ( echo "not valid"
при совпадении) заставляет меня думать, что вы думаете, что все наоборот. Вам нужно отменить тест.
Чтобы отрицать ваш тест, поместите !
перед [[
:
if ! [[ "$URL" =~ $regex ]]; then
В качестве альтернативы вы можете отрицать выражение внутри [[ ]]
:
if [[ ! "$URL" =~ $regex ]]; then
Дополнительно, пожалуйста, прочтитеПониманиеIFS= read -r line
и, возможно, скорректируйте свою read
команду.