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?
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?
Jawaban:
jika Anda memiliki bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
jika tidak, Anda harus memberi tahu kami shell apa yang Anda gunakan.
alternatif, menggunakan awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
digunakan untuk membandingkan dua string, tetapi responnya menunjukkan perbandingan case-insensitive menggunakan case
pernyataan. Meyakinkan, para shopt
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 dengan SHELLNOCASEMATCH=`shopt -p nocasematch`
lalu ubah dengan shopt -s nocasematch
dan setelah selesai, kembalikan dengan$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
karena shopt -p
akan keluar dengan kode 1 jika opsi tidak disetel, dan ini dapat menyebabkan skrip dibatalkan jika set -e
sedang berlaku.
Di Bash, Anda dapat menggunakan ekspansi parameter untuk memodifikasi string ke semua huruf kecil / huruf besar:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
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):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Yang Anda lakukan di sana adalah mengonversi kedua string menjadi huruf kecil dan membandingkan hasilnya.
Simpan status nocasematch (kalau-kalau ada fungsi lain yang tergantung padanya dinonaktifkan):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Catatan: hanya gunakan local
jika ada di dalam fungsi.
case
pernyataan (termasuk yang ada di jawaban ghostdog) akan selalu membuat kulit saya merangkak
Salah satu caranya adalah dengan mengkonversi kedua string ke atas atau bawah:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Cara lain adalah dengan menggunakan grep:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
metode ini di aplikasi Docker-ized saya berdasarkan alpine (yang menyediakan sh
via busybox
). Terima kasih.
Untuk korn shell, saya menggunakan perintah bawaan typeset (-l untuk huruf kecil dan -u untuk huruf besar).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Sangat mudah jika Anda ingin melakukan perbandingan case-insensitive line:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
Untuk zsh
sintaks sedikit berbeda, tetapi masih lebih pendek daripada kebanyakan jawaban di sini:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
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 menggunakan i
flag glob:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
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
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. Gunakan regex dengan pola kasus
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. Nyalakan nocasematch
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
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