在 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