Salah satu argumen bahwa script saya menerima adalah tanggal dalam format berikut: yyyymmdd
.
Saya ingin memeriksa apakah saya mendapatkan tanggal yang valid sebagai input.
Bagaimana saya bisa melakukan ini? Saya mencoba menggunakan regex seperti:[0-9]\{\8}
Jawaban:
Anda dapat menggunakan konstruksi uji
[[ ]]
,, bersama dengan operator pencocokan ekspresi reguler=~
,, untuk memeriksa apakah string cocok dengan pola regex.Untuk kasus spesifik Anda, Anda dapat menulis:
Atau lebih banyak tes yang akurat:
Artinya, Anda bisa mendefinisikan regex di Bash yang cocok dengan format yang Anda inginkan. Dengan cara ini Anda dapat melakukan:
di mana perintah setelah
&&
dieksekusi jika tes berhasil, dan perintah setelah||
dijalankan jika tes tidak berhasil.Catatan ini didasarkan pada solusi oleh Aleks-Daniel Jakimenko di verifikasi format tanggal input Pengguna di bash .
Di shell lain Anda dapat menggunakan grep . Jika shell Anda kompatibel dengan POSIX, lakukan
Pada ikan , yang tidak sesuai dengan POSIX, Anda bisa melakukannya
sumber
grep
perintah dengan-E
flag.sh
,fish
atau kerang yang kurang lengkap lainnya.Dalam bash versi 3 Anda dapat menggunakan operator '= ~':
Referensi: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF
sumber
Cara yang baik untuk menguji apakah string adalah tanggal yang benar adalah dengan menggunakan tanggal perintah:
dari komentar: orang dapat menggunakan format
sumber
date -d 2017-11-14e
mengembalikannya Selasa 14 November 05:00:00 UTC 2017, tapi itu akan merusak skrip saya.Saya akan menggunakan
expr match
sebagai gantinya=~
:Ini lebih baik daripada jawaban yang saat ini diterima menggunakan
=~
karena=~
juga akan cocok dengan string kosong, yang seharusnya tidak IMHO. Misalkanbadvar
tidak didefinisikan, lalu[[ "1234" =~ "$badvar" ]]; echo $?
memberi (salah)0
, sambilexpr match "1234" "$badvar" >/dev/null ; echo $?
memberikan hasil yang benar1
.Kita harus menggunakan
>/dev/null
untuk menyembunyikanexpr match
's nilai output , yang merupakan jumlah karakter cocok atau 0 jika tidak ada kecocokan ditemukan. Perhatikan nilai outputnya berbeda dari status keluarnya . Status keluar adalah 0 jika ada kecocokan yang ditemukan, atau 1 jika tidak.Secara umum, sintaks untuk
expr
adalah:Atau:
di mana
$lead
ekspresi reguler. Ituexit status
akan benar (0) jikalead
cocok dengan irisan terkemukastring
(Apakah ada nama untuk ini?). Misalnyaexpr match "abcdefghi" "abc"
keluartrue
, tetapiexpr match "abcdefghi" "bcd"
keluarfalse
. (Kredit ke @Carlo Wood karena menunjukkan ini.sumber
=~
tidak cocok dengan string kosong, Anda mencocokkan string dengan pola kosong pada contoh yang Anda berikan. Sintaksnya adalahstring =~ pattern
, dan pola kosong cocok dengan semuanya.expr match "abcdefghi" "^" && echo Matched || echo No match
- danexpr match "abcdefghi" "bcd" && echo Matched || echo No match
- keduanya kembali"0\nNo match"
. Dimana pencocokan"a.*f"
akan kembali"6\nMatched"
. Oleh karena itu, penggunaan '^' dalam contoh Anda juga tidak perlu dan sudah tersirat.=~
mencocokkan string kosong. Ini karena perilaku ini mungkin tidak terduga dan dapat menyebabkan kesalahan. Saya menulis jawaban ini secara khusus karena saya dibakar olehnya.expr
setuju dengan saya.Jika penggunaan regex dapat membantu untuk menentukan apakah urutan karakter suatu tanggal benar, itu tidak dapat digunakan dengan mudah untuk menentukan apakah tanggal tersebut valid. Contoh berikut akan melewati ekspresi reguler, tetapi semua tanggal tidak valid: 20180231, 20190229, 20190431
Jadi jika Anda ingin memvalidasi jika string tanggal Anda (sebut saja
datestr
) dalam format yang benar, yang terbaik untuk menguraikannyadate
dan memintadate
untuk mengubah string ke format yang benar. Jika kedua string identik, Anda memiliki format dan tanggal yang valid.sumber