$ 1 öğesinin / bin / dash içinde bir tam sayı olup olmadığını kontrol etmenin en iyi yolu nedir?
Bash'da şunları yapabilirim:
[[ $1 =~ ^([0-9]+)$ ]]
Ancak bu POSIX uyumlu görünmüyor ve tire bunu desteklemiyor
$ 1 öğesinin / bin / dash içinde bir tam sayı olup olmadığını kontrol etmenin en iyi yolu nedir?
Bash'da şunları yapabilirim:
[[ $1 =~ ^([0-9]+)$ ]]
Ancak bu POSIX uyumlu görünmüyor ve tire bunu desteklemiyor
Yanıtlar:
Aşağıdaki, pozitif veya negatif tamsayıları algılar dash
ve POSIX altında çalışır :
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
Veya :
(nop) komutunu biraz kullanarak :
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
İster dash
, bash
, ksh
, zsh
, POSIX sh
veya posh
( "Bourne kabuğunun bir reimplementation" sh
); case
yapı en yaygın kullanılan ve güvenilirdir:
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
dash
mi? Benim için çalışıyor bash
ama çalışmıyor dash
.
dash
; echo $?
case komutundan sonra eklediğim sonucu sorgulamak için .
posh
("Bourne kabuğunun yeniden uygulanması") da bu çözümle ilgili bir sorun yaşamıyor.
case
; bir nedeni tanımladığınız hatadır, başka bir editörlerde, parantez (vim) ile eşleşen özelliklere sahip olan editörlerde çok daha iyi destek verir ve en azından kişisel olarak daha iyi okunabilir buluyorum. - WRT posh
POSIX; Eh, verdiğim adam sayfasından alıntı başka bir şey önerdi, ama sanırım, bu tür gayrı resmi ifadelere güvenemezsiniz. Eski bourne kabuğu artık POSIX çağında olduğumuz için o kadar da önemli değil.
Sen kullanabilirsiniz -eq
kendisiyle, ipe testi:
$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number
Hata mesajı bir sorunsa, hata çıktısını şuraya yönlendirin /dev/null
:
$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
" 023 "
bir sayı olduğunu söyleyebiliriz . İşlenenler ondalık tamsayılarsa davranış belirtilmediğinden, tire ile çalıştığını, ancak diğer tüm POSIX kabuklarını çalışmadığını unutmayın. Örneğin ksh ile, SHLVL
ya 1+1
da bir sayı olduğunu söyleyebilir .
Bir aritmetik genişletme olarak kullanmayı deneyin ve çalışıp çalışmadığına bakın. Aslında, bundan biraz daha katı olmanız gerekir, çünkü aritmetik açılımlar önde gelen ve arkadaki boşlukları görmezden gelir. Aritmetik bir genişleme yapın ve genişletilmiş sonucun orijinal değişkenle tam olarak eşleştiğinden emin olun.
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
Bu, negatif sayıları da kabul eder - eğer gerçekten hariç tutmak istiyorsanız, ekstra bir kontrol ekleyin $((${1} >= 0))
.
[[
$(( ... ))
? Eğer öyleyse, cevabım hala maddi olarak doğru olmalı, sadece ekstra alıntı eklemem gerekiyor.
check_if_number 1.2
ve fonksiyon döndü: dash: 3: arithmetic expression: expecting EOF: "1.2"
Belki ile expr
?
if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
echo "integer"
else
echo "non-integer"
fi
match
ne \+
. Ayrıca 0'ın bir sayı olmadığını söyleyebiliriz. Sen istiyorsunexpr "x$1" : 'x[0-9]\{1,\}$'
POSIX sisteminde ifade kullanabilirsiniz :
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
expr
uygulamalar 9999999999999999999'un bir tam sayı olmadığını söyleyecektir. POSIX bunun işe yarayacağına dair hiçbir garanti vermez. Uygulamada, en azından bir GNU sisteminde, "uzunluk" un bir tamsayı olduğunu söyleyecektir.
expr 9999999999999999999 + 0
bana 3 çıkış durumu verir ve expr -12 + 0
ve expr length + 0
bana GNU expr ile 0 çıkış durumu vermek ( + string
kuvvetler string
GNU bir dize olarak dikkate alınması gereken expr
. expr "$a" - 0
Daha iyi çalışacak).
-12
geçerli bir tamsayı ve 9999999999999999999
bir taşma verdi.
İşte muru'nun cevabı ile aynı yöntemi kullanan basit bir fonksiyon :
IsInteger() # usage: IsInteger string
{ # returns: flag
[ "$1" -eq "$1" ] 2> /dev/null
}
Misal:
p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
Çıktı:
'2a3' isn't an integer
'23' is an integer
foo\n123\nbar
tamsayı değildir, ancak bu testi geçecektir.