lee*_*oon 4 osx bash text-processing variable
我想提示用户输入一个URL,但它只能包含A-Z,a-z,0-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。
你很接近。
您要检查 URL 是否包含至少一个不允许的字符(然后将其报告为无效),而不是至少包含一个允许的字符。
您可以使用!(^也适用于bash其他一些 shell)来否定括号表达式中的字符集。
在任何情况下,你是对的单独明确列出文字,使用像范围a-z,A-Z,0-9只会工作(仅匹配您所列出的26个+ 26个+ 10个字符)的C语言环境。在其他语言环境中,他们可以匹配数千个其他字符,甚至可以匹配由多个字符组成的元素(排序之间A和Z喜欢的字符É,例如 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)