在 BASH 中与 grep 的参数中验证 http:// 或 https://
Verification of http:// or https:// in an argument with grep in BASH
Input = ./q4.sh https://cdn.eso.org/images/thumb700x/eso1723a.jpg
echo | -Eiq '^https?://' 2> /dev/null || echo 'Ce script supporte seulement les URLs commencant par https:// ou http://' && exit 1
输出总是跳到最后一个|| echo 'Ce script supporte seulement les URLs commencant par https:// ou http://'
即使我的参数 1 有 http:// 或 https://
这可能会让您走上正确的道路
echo "" | grep -Eiq '^https?://' 2>/dev/null || echo "fail"
假设在不失一般性的情况下调用脚本时使用一个参数 http://something
:
echo | grep -i "http://"
不会在由 echo
输出到管道的字符串 http://something
中寻找 http://
,因为 grep option(s) regexp argument
忽略了它的标准输入和而是读取由 参数命名的文件 。因此它会尝试读取 一个名为 http://something
的文件,当然这个文件不存在。但是由于您已经重定向 2>/dev/null
,告诉您这件事的错误消息消失了,所以您只会收到抱怨 URL 的消息并退出。
echo | grep -i "http://"
(对于 https 也类似)会起作用,但是非常笨拙。它还将(匹配的)URL 输出到标准输出,您 没有 重定向,因此它可能会出现在您的终端上,这可能是也可能不是您想要的.通常,只要参数可以包含空格(或其他 IFS 定界符)或任何通配符(glob)字符,您就应该使用 echo "" ...
,但是有效的 URL 不能做第一个,而且几乎永远不会做最后,因此在这种特定情况下它不太重要。
另外 grep 将 匹配并因此接受 包含 http:// 或 https:// 的 URL但不会 以 开头,因为回显消息状态是必需的。如果只想在开头匹配,请在正则表达式中使用 ^
。
一个更有效的解决方案是使用来自此处字符串的输入的单个 grep(^https?
在扩展模式下意味着 'either http or https but only at beginning'):
grep -Ei "^https?://" <<< || echo "URL must begin ..." && exit 1
# if you don't want the matched URL output on stdout,
# either redirect [1]>/dev/null or add q to the options (-Eiq)
如果你可以满足于 lowercase-only 甚至更高效(根本没有 grep)(实际上人们总是使用 URL 方案,即使标准说应该接受大写字母) 是:
case in (http://* https://*) ;; (*) echo "URL must begin ..." ... ; esac
如果您需要不区分大小写的匹配
shopt -s nocasematch
if [[ ! "" =~ ^https?:// ]]
then
echo 'ERROR' >&2
fi
作为 grep
甚至 bash
的正则表达式匹配的替代方法,您可以使用模式匹配。
if [[ != http?(s)://* ]]; then
Input = ./q4.sh https://cdn.eso.org/images/thumb700x/eso1723a.jpg
echo | -Eiq '^https?://' 2> /dev/null || echo 'Ce script supporte seulement les URLs commencant par https:// ou http://' && exit 1
输出总是跳到最后一个|| echo 'Ce script supporte seulement les URLs commencant par https:// ou http://'
即使我的参数 1 有 http:// 或 https://
这可能会让您走上正确的道路
echo "" | grep -Eiq '^https?://' 2>/dev/null || echo "fail"
假设在不失一般性的情况下调用脚本时使用一个参数 http://something
:
echo | grep -i "http://"
不会在由 echo
输出到管道的字符串 http://something
中寻找 http://
,因为 grep option(s) regexp argument
忽略了它的标准输入和而是读取由 参数命名的文件 。因此它会尝试读取 一个名为 http://something
的文件,当然这个文件不存在。但是由于您已经重定向 2>/dev/null
,告诉您这件事的错误消息消失了,所以您只会收到抱怨 URL 的消息并退出。
echo | grep -i "http://"
(对于 https 也类似)会起作用,但是非常笨拙。它还将(匹配的)URL 输出到标准输出,您 没有 重定向,因此它可能会出现在您的终端上,这可能是也可能不是您想要的.通常,只要参数可以包含空格(或其他 IFS 定界符)或任何通配符(glob)字符,您就应该使用 echo "" ...
,但是有效的 URL 不能做第一个,而且几乎永远不会做最后,因此在这种特定情况下它不太重要。
另外 grep 将 匹配并因此接受 包含 http:// 或 https:// 的 URL但不会 以 开头,因为回显消息状态是必需的。如果只想在开头匹配,请在正则表达式中使用 ^
。
一个更有效的解决方案是使用来自此处字符串的输入的单个 grep(^https?
在扩展模式下意味着 'either http or https but only at beginning'):
grep -Ei "^https?://" <<< || echo "URL must begin ..." && exit 1
# if you don't want the matched URL output on stdout,
# either redirect [1]>/dev/null or add q to the options (-Eiq)
如果你可以满足于 lowercase-only 甚至更高效(根本没有 grep)(实际上人们总是使用 URL 方案,即使标准说应该接受大写字母) 是:
case in (http://* https://*) ;; (*) echo "URL must begin ..." ... ; esac
如果您需要不区分大小写的匹配
shopt -s nocasematch
if [[ ! "" =~ ^https?:// ]]
then
echo 'ERROR' >&2
fi
作为 grep
甚至 bash
的正则表达式匹配的替代方法,您可以使用模式匹配。
if [[ != http?(s)://* ]]; then