Kabuk kodlamasında büyük / küçük harf duyarlılığı


10

Şu Bash betiğini düşünün:

#!/bin/bash
echo Enter any character
read char
case $char in
    [a-z]) echo Lower case letter
            ;;
    [A-Z]) echo Upper case letter
            ;;
    [0-9]) echo Number
            ;;
    ?) echo Special char
            ;;
    *) echo You entered more than one character 
            ;;
esac

'A' girersem, çıktı Küçük harf olur ve 'A' için de aynıdır ... Bunun üstesinden nasıl gelirim?


Bir komut dosyası yüklerken boşlukları korumak için kod biçimini kullandığınızdan emin olun. Ayrıca, asıl soru nedir? Ne demek istediğinden emin değilim ...
AJefferiss

2
@ Arronical gerek yok, echo ayrılmış kelimeler ile başa çıkabilirim echo if case then do.
terdon

Benzer bir sorun için, ancak sıralama ile uğraşmak için bkz. Askubuntu.com/questions/597924/…
Joe

Yanıtlar:


20
#!/bin/bash
echo 'enter any character'
read char
case $char in
[[:lower:]]) echo 'lower case letter'
    ;;
[[:upper:]]) echo 'upper case letter'
    ;;
[0-9]) echo 'number'
    ;;
?) echo 'special char'
    ;;
*) echo 'u entered more than one char' 
    ;;
esac  

[Az] ' nın küçük harfli düzenli ifadesi ve bash'da [AZ]' nın büyük harfli düzenli ifadesi hakkında daha fazla bilgi için bkz . Nocasematch kapalıyken vaka ifadesi neden büyük / küçük harfe duyarlı değildir? .


6
Bundan sonra, yerine [0-9]kullanabilirsiniz [[:digit:]]. man grepGoogle posix karakter sınıflarında daha fazla örnek bulabilirsiniz .
Paddy Landau

21

Sorun, karakter aralığının [a-z]aslında büyük harf içermesidir. Bu bash kılavuzunda açıklanmıştır :

Köşeli ayraç ifadesinde, aralık ifadesi tire ile ayrılmış iki karakterden oluşur. İki karakter arasında (dahil) sıralanan herhangi bir karakterle eşleşir. Varsayılan C yerel ayarında, sıralama dizisi yerel karakter sırasıdır; örneğin, '[ad]', '[abcd]' ile eşdeğerdir. Diğer yerel ayarlarda, sıralama dizisi belirtilmez ve '[ad]', '[abcd]' veya '[aBbCcDd]' ile eşdeğer olabilir veya herhangi bir karakterle veya karakter kümesiyle eşleşmeyebilir maçlar düzensiz bile olabilir. Köşeli parantez ifadelerinin geleneksel yorumunu elde etmek için, LC_ALL ortam değişkenini 'C' değerine ayarlayarak 'C' yerel ayarını kullanabilirsiniz.

Örneklemek gerekirse:

$ case B in [a-c]) echo YES;;  *) echo NO;; esac
YES
$ LC_ALL=C; case B in [a-c]) echo YES;; *) echo NO;; esac
NO

Yani, olan şey, bulunduğunuz yerde (ki C) [a-c]aslında olmasıdır [aAbBcC]. Bu nedenle POSIX karakter sınıflarını @ karel tarafından önerilen şekilde kullanmalısınız.


4
Daha doğrusu, sette gerek LC_COLLATEüzere C, diğer yerel ayarları için 's ok farklı olmak. LC_COLLATEHerhangi bir şeye ayarlamak Cnadiren iyi bir fikir ama ne yazık ki Ubuntu bunu yapıyor (bugüne kadar tek suçlu değil).
Gilles 'SO- kötü olmayı bırak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.