Bir giriş numarasının bir tam sayı olup olmadığını kontrol etme


31

Bir girişin bir tamsayı olup olmadığını kontrol etmeye çalışıyorum ve yüzlerce kez üstünden geçtim ancak bu hatayı göremiyorum. Ne yazık ki çalışmaz, tüm girdiler için if ifadesini tetikler (sayılar / harfler)

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

Alıntılar ile oynadım ama ya kaçırdım ya da hiçbir şey yapmadı. Neyi yanlış yapıyorum? Bir girişin sadece bir INTEGER olup olmadığını test etmenin daha kolay bir yolu var mı?

Yanıtlar:


25

Tırnakları kaldır

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi

stackoverflow.com/questions/806906/… geriye dönük teklifleri vardı
lonewarrior556

Demek bir böcek var. Tırnak işaretleri ile regexp değişmez bir dize olarak değerlendirilir. Biri ile kontrol edebilirsinizscale='^[0-9]+$'; [[ "$scale" == "^[0-9]+$" ]] && echo equal || echo "not equal"
jimmij

15

Test komutu -eqoperatörünü kullanın :

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

Sadece içinde bashdeğil aynı zamanda herhangi bir POSIX kabuğunda da çalışır . POSIX test dokümanlarından:

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.

o onun herhangi bir sayı değil, sadece tamsayılar eğer kontroller
lonewarrior556

2
@ lonewarrior556: Sadece tamsayı için çalışıyor, bakınız: pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Sanırım herhangi bir sayı için söylemiştin, çünkü benimki olarak [[eski test yerine yeni test kullanıyorsun [.
cuonglm

İyi fikir ama biraz gürültülü. Hataları null'a yönlendirmek zorunda kalmamayı tercih ederim.
Wildcard,

2
@Wildcard: Evet, taşınabilirlik için ödeme yapıyoruz.
cuonglm

8

İmzasız tamsayılar için kullanıyorum:

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

Testler:

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only

1
Ben hızlı, ve oldukça posix gibi yapılı, yapılı ile yapılan gibi seviyorum ... Eski bir kabuk (bash 2.0.5) denedim ve mükemmel çalışıyor.
Olivier Dulac

Argümanın içindeki boşluklardan ne haber? Gibi ”086“ .
0andriy

@ 0andriy İkinci teste bakınız.
raciasolvo

8

OP sadece pozitif tamsayılar istiyor gibi görünüyor:

[ "$1" -ge 0 ] 2>/dev/null

Örnekler:

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

Tek bir [testin gerekli olduğunu unutmayın :

$ [[ "word" -eq 0 ]] && echo word equals zero || echo nope
word equals zero
$ [ "word" -eq 0 ] && echo word equals zero || echo nope
-bash: [: word: integer expression expected
nope

Bunun nedeni, başvurunun kaldırılması ile gerçekleşmesidir [[:

$ word=other
$ other=3                                                                                                                                                                                  
$ [[ $word -eq 3 ]] && echo word equals other equals 3
word equals other equals 3

Gerçek cevap bu ... diğerleri başarısız oldu
Scott Stensland

3
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

Bu kontrol yapar ve hatayı çıkarır.


OPTINDburada da iyidir. sadece saiyan.
mikeserv

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.