如何在 bash 变量中只允许某些字符

lee*_*oon 4 osx bash text-processing variable

我想提示用户输入一个URL,但它只能包含A-Za-z0-9&./=_-:,和?

因此,例如:

Enter URL:
$ http://youtube.com/watch?v=1234df_AQ-x
That URL is allowed.

Enter URL:
$ https://unix.stackexchange.com/$FAKEurl%123
That URL is NOT allowed.
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我想出的,但似乎无法正常工作:

if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\-\_\/\&\?\:\.\=]* ]]; then
    echo "That URL is NOT allowed."
else
    echo "That URL is allowed."
fi
Run Code Online (Sandbox Code Playgroud)

请注意,我在示例中提供的 URL 只是示例。该脚本需要处理所有可能的用户输入;它不能包含我之前指定的字符以外的字符。

在 macOS High Sierra 10.13.6 下使用 bash 3.2.57(1)-release。

Sté*_*las 6

你很接近。

您要检查 URL 是否包含至少一个不允许的字符(然后将其报告为无效),而不是至少包含一个允许的字符。

您可以使用!(^也适用于bash其他一些 shell)来否定括号表达式中的字符集。

在任何情况下,你是对的单独明确列出文字,使用像范围a-zA-Z0-9只会工作(仅匹配您所列出的26个+ 26个+ 10个字符)的C语言环境。在其他语言环境中,他们可以匹配数千个其他字符,甚至可以匹配由多个字符组成的元素(排序之间AZ喜欢的字符É,例如 for A-Z)。

case $URL in
  ("" | *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_/\&?:.=-]*)
    echo >&2 "That URL is NOT allowed.";;
  (*)
    echo "That URL is allowed.";;
esac
Run Code Online (Sandbox Code Playgroud)