The ==
operator yang digunakan untuk membandingkan dua string di shell script. Namun, saya ingin membandingkan dua string mengabaikan case, bagaimana bisa dilakukan? Apakah ada perintah standar untuk ini?
string
shell
compare
case-insensitive
Sachin Chourasiya
sumber
sumber
if
pernyataan,shopt
pendekatan mengharuskan Anda untuk menggunakan[[ ]]
bentuk braket ganda kondisional daripada[ ]
bentuk braket tunggal . Lihat juga: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html==
digunakan untuk membandingkan dua string, tetapi responnya menunjukkan perbandingan case-insensitive menggunakancase
pernyataan. Meyakinkan, parashopt
solusi juga memungkinkan kasus-sensitif penggunaan==
,=~
dan operator perbandingan string lainnya.shopt -u nocasematch
setelah perbandingan dilakukan untuk mengembalikan kembali ke default bash.nocasematch
pengaturan. Raih denganSHELLNOCASEMATCH=`shopt -p nocasematch`
lalu ubah denganshopt -s nocasematch
dan setelah selesai, kembalikan dengan$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
karenashopt -p
akan keluar dengan kode 1 jika opsi tidak disetel, dan ini dapat menyebabkan skrip dibatalkan jikaset -e
sedang berlaku.Di Bash, Anda dapat menggunakan ekspansi parameter untuk memodifikasi string ke semua huruf kecil / huruf besar:
sumber
echo
pernyataan pertama menghasilkan:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
ini diterapkan tetapi biasanya solusi "tingkat bahasa" seperti itu menanganinya dengan benar.Semua jawaban ini mengabaikan cara termudah dan tercepat untuk melakukan ini (selama Anda memiliki Bash 4):
Yang Anda lakukan di sana adalah mengonversi kedua string menjadi huruf kecil dan membandingkan hasilnya.
sumber
Simpan status nocasematch (kalau-kalau ada fungsi lain yang tergantung padanya dinonaktifkan):
Catatan: hanya gunakan
local
jika ada di dalam fungsi.sumber
case
pernyataan (termasuk yang ada di jawaban ghostdog) akan selalu membuat kulit saya merangkakSalah satu caranya adalah dengan mengkonversi kedua string ke atas atau bawah:
Cara lain adalah dengan menggunakan grep:
sumber
tr
metode ini di aplikasi Docker-ized saya berdasarkan alpine (yang menyediakansh
viabusybox
). Terima kasih.Untuk korn shell, saya menggunakan perintah bawaan typeset (-l untuk huruf kecil dan -u untuk huruf besar).
sumber
Sangat mudah jika Anda ingin melakukan perbandingan case-insensitive line:
sumber
if fgrep -qix -- "$str1" <<<"$str2"; then
sebagai gantinya.Inilah solusi saya menggunakan tr:
sumber
grep
memiliki-i
flag yang artinya case sensitive, jadi minta untuk memberi tahu Anda jika var2 ada di var1.sumber
Untuk
zsh
sintaks sedikit berbeda, tetapi masih lebih pendek daripada kebanyakan jawaban di sini:Ini akan mengubah kedua string menjadi huruf besar sebelum perbandingan.
Metode lain menggunakan zsh's
globbing flags
, yang memungkinkan kita untuk secara langsung menggunakan pencocokan case-insensitive dengan menggunakani
flag glob:sumber
shopt -s nocaseglob
sumber
Saya menemukan blog / tutorial / hebat ini tentang berurusan dengan pola sensitif huruf . Tiga metode berikut dijelaskan secara rinci dengan contoh-contoh:
1. Ubah pola menjadi huruf kecil menggunakan perintah tr
2. Gunakan regex dengan pola kasus
3. Nyalakan nocasematch
sumber