GNU/Linux >> Linux の 問題 >  >> Linux

Bash変数で特定の文字のみを許可するにはどうすればよいですか?

ユーザーに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

Linux
  1. 文字列の一部のみをBashの変数に割り当てますか?

  2. Linux で Chroot SFTP をセットアップする方法 (SSH ではなく SFTP のみを許可する)

  3. Bashで変数が数値かどうかをテストするにはどうすればよいですか?

  1. Linux 環境変数名で使用できる文字

  2. diff (bash) を使用して異なる行のみを表示する方法

  3. bashコマンド文字列の逐語的な文字を確認するにはどうすればよいですか?

  1. Bashでループを作成する方法

  2. Linuxで特定のサイズの画像のみを一括コピーする方法

  3. Bashスクリプト(I)