==
Operatör kabuk komut iki dizeleri için kullanılır. Ancak iki dizgeyi büyük / küçük harfleri görmezden gelerek karşılaştırmak istiyorum, nasıl yapılabilir? Bunun için herhangi bir standart komut var mı?
==
Operatör kabuk komut iki dizeleri için kullanılır. Ancak iki dizgeyi büyük / küçük harfleri görmezden gelerek karşılaştırmak istiyorum, nasıl yapılabilir? Bunun için herhangi bir standart komut var mı?
Yanıtlar:
bash varsa
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
aksi takdirde, bize hangi kabuğu kullandığınızı söylemelisiniz.
alternatif, awk kullanarak
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
iki dizeyi karşılaştırmak için kullanıldığını gösterir , ancak yanıt, bir case
ifade kullanarak büyük / küçük harfe duyarlı olmayan karşılaştırmayı gösterir . Reassuringly, shopt
çözüm ayrıca küçük harfe duyarsız kullanımını sağlayan ==
, =~
ve diğer dize karşılaştırma operatörlerini.
shopt -u nocasematch
karşılaştırma yapıldıktan sonra bash'ın varsayılanına geri dönmek için yürütmek akıllıca olacaktır .
nocasematch
Ayarı kaydetmek ve geri yüklemek için en iyisi . İle Kepçe SHELLNOCASEMATCH=`shopt -p nocasematch`
sonra bunu değiştirmek shopt -s nocasematch
ve bitmiş bir kez ile geri$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
çünkü shopt -p
seçenek ayarlanmadıysa kod 1 ile çıkılır ve bu etkinse komut dosyasının iptal edilmesine neden olabilir set -e
.
Bash'de, bir dizeyi tümü küçük / büyük harf olacak şekilde değiştirmek için parametre genişletmeyi kullanabilirsiniz:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
ifade şu sonuca varıyor :-bash: ${var1,,}: bad substitution
shopt -s nocasematch
uygulandığını bilmiyorum ama genellikle bu tür "dil düzeyinde" çözümler bunu doğru bir şekilde ele alıyor.
Tüm bu yanıtlar, bunu yapmanın en kolay ve en hızlı yolunu görmezden gelir (Bash 4'e sahip olduğunuz sürece):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Orada yaptığınız tek şey, her iki dizeyi de küçük harfe dönüştürmek ve sonuçları karşılaştırmaktır.
Nocasematch durumunu kaydedin (başka bir işlevin devre dışı bırakılmasına bağlı olması durumunda):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Not: yalnızca local
bir işlevin içindeyse kullanın .
case
ifadeler (hayalet köpeğin cevabındakiler dahil) her zaman
Bunun bir yolu, her iki dizeyi de yukarı veya aşağıya dönüştürmek olabilir:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Başka bir yol da grep kullanmaktır:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
(içerir alpine göre zaman docker-ize uygulamalarda yöntem sh
ile busybox
). Teşekkür ederim.
Korn kabuğu için, dizgi yerleşik komutunu kullanıyorum (küçük harf için -l ve büyük harf için -u).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Büyük / küçük harfe duyarlı olmayan bir satır karşılaştırması yapmaya karar verirseniz çok kolaydır:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
grep
büyük / -i
küçük harfe duyarlı olmayan bir bayrağa sahiptir, bu nedenle var2'nin var1'de olup olmadığını size söylemesini isteyin.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
İçin zsh
sözdizimi biraz farklı, ama burada en yanıtlardan daha hala kısadır:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Bu, karşılaştırmadan önce her iki dizeyi de büyük harfe dönüştürür.
Başka bir yöntem globbing flags
, i
glob bayrağını kullanarak büyük / küçük harfe duyarsız eşleşmeyi doğrudan kullanmamızı sağlayan zsh'leri kullanır :
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
Bu harika bloga / öğreticiye / büyük / küçük harfe duyarlı kalıpla ilgili her ne olursa olsun karşılaştım . Aşağıdaki üç yöntem, örneklerle ayrıntılı olarak açıklanmıştır:
1. tr komutunu kullanarak deseni küçük harfe dönüştürün
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. Büyük / küçük harf kalıplarında normal ifade kullanın
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. Nocasematch'i açın
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
İfadeleri kullanarak dizeleri karşılaştıran herkes için bushopt
yaklaşım[[ ]]
, tek köşeli parantez yerine çift köşeli parantez koşullu formun kullanılmasını gerektirir[ ]
. Ayrıca bkz .: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html