==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 caseifade 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 nocasematchkarşı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 .
nocasematchAyarı kaydetmek ve geri yüklemek için en iyisi . İle Kepçe SHELLNOCASEMATCH=`shopt -p nocasematch`sonra bunu değiştirmek shopt -s nocasematchve bitmiş bir kez ile geri$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)çünkü shopt -pseç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^^}
echoifade şu sonuca varıyor :-bash: ${var1,,}: bad substitution
shopt -s nocasematchuygulandığı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 localbir işlevin içindeyse kullanın .
caseifadeler (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 shile 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
grepbüyük / -iküçü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 zshsö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, iglob 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 bushoptyaklaşı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