ユーザーに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.
これは私がこれまでに思いついたものですが、正しく機能していないようです:
if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\-\_\/\&\?\:\.\=]* ]]; then
echo "That URL is NOT allowed."
else
echo "That URL is allowed."
fi
例で提供したURLは単なる例であることに注意してください。
このスクリプトは、考えられるすべてのユーザー入力で機能する必要があります。前に指定した文字以外の文字を含めることはできません。
bash 3.2.57(1)の使用-macOS HighSierra10.13.6でリリース。
承認された回答:
あなたは近くにいました。
URLに、許可された文字の少なくとも1つではなく、許可されていない文字が少なくとも1つ含まれているかどうかを確認します(その後、無効として報告します)。
!
を使用して、角かっこ式の文字セットを無効にすることができます。 ( ^コード>
bash
でも機能します および他のいくつかのシェル)。
いずれにせよ、 a-z
のような範囲を使用して、文字を個別に明示的にリストするのは正しいことでした。 、 A-Z
、 0-9
Cロケールでのみ機能します(リストした26 + 26 + 10文字のみに一致します)。他のロケールでは、他の何千もの文字と一致したり、複数の文字( A
の間でソートされる要素)で構成された要素を照合したりすることもできます。 およびZ
É
のように たとえば、 A-Z
。
case $URL in
("" | *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_/\&?:.=-]*)
echo >&2 "That URL is NOT allowed.";;
(*)
echo "That URL is allowed.";;
esac