我有以下代码:
read -p ":" URL
regex='^(https?\:\/\/)?(www\.youtube\.com)\/.+$'
if [[ "$URL" =~ $regex ]]; then
echo "not valid url "
exit
fi
echo 'Init fnction'
Init FUnction
我输入网址: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...
我不明白,验证 YouTube 上的 URL 的正确方法是什么?
答案1
里面[[ ]]
=~
不是否定的=
。
=~
是一个允许你匹配正则表达式的运算符,而=
与正则表达式无关。请参阅Bash 中的条件构造,[[
并=~
在那里进行了描述。最重要的片段:
=~
还有一个额外的二元运算符, ,其优先级与==
和相同!=
。使用时,运算符右侧的字符串被视为 POSIX 扩展正则表达式,并进行相应的匹配 […]。
当且仅当正则表达式匹配,测试才成功。你的脚本流程(echo "not valid"
匹配时)让我相信你认为情况正好相反。你需要否定测试。
要否定测试,请!
在之前放置[[
:
if ! [[ "$URL" =~ $regex ]]; then
或者,你可以否定其中的表达式[[ ]]
:
if [[ ! "$URL" =~ $regex ]]; then
另外请阅读理解IFS= read -r line
并可能调整你的read
命令。