Saya ingin meminta pengguna untuk memasukkan URL, tetapi hanya dapat berisi A-Z
, a-z
, 0-9
, &
, .
, /
, =
, _
, -
, :
, dan ?
.
Jadi, misalnya:
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.
Inilah yang saya dapatkan sejauh ini, tetapi tampaknya tidak berfungsi dengan benar:
if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\-\_\/\&\?\:\.\=]* ]]; then
echo "That URL is NOT allowed."
else
echo "That URL is allowed."
fi
Harap perhatikan bahwa URL yang saya berikan dalam contoh hanyalah contoh.
Skrip ini harus bekerja dengan semua kemungkinan input pengguna; hanya saja tidak boleh berisi karakter selain yang saya tentukan sebelumnya.
Menggunakan bash 3.2.57(1)-release di bawah macOS High Sierra 10.13.6.
Jawaban yang Diterima:
Anda sudah dekat.
Anda ingin memeriksa apakah URL berisi setidaknya satu karakter yang tidak diizinkan (lalu laporkan sebagai tidak valid), bukan setidaknya satu karakter yang diizinkan.
Anda dapat meniadakan set karakter dalam ekspresi kurung dengan !
(^
juga bekerja dengan bash
dan beberapa cangkang lainnya).
Bagaimanapun, Anda benar untuk secara eksplisit mencantumkan karakter satu per satu, menggunakan rentang seperti a-z
, A-Z
, 0-9
hanya akan berfungsi (pada pencocokan hanya 26+26+10 karakter yang Anda daftarkan) di lokal C. Di lokal lain, mereka dapat mencocokkan ribuan karakter lain atau bahkan menyusun elemen yang dibuat dari lebih dari satu karakter (karakter yang diurutkan antara A
dan Z
seperti É
misalnya untuk A-Z
).
case $URL in
("" | *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_/\&?:.=-]*)
echo >&2 "That URL is NOT allowed.";;
(*)
echo "That URL is allowed.";;
esac