@Charles Dufy ve diğerleri tarafından açık bir cevap verilmiştir. Saf bir bash çözümü aşağıdakileri kullanıyor olabilir:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Gerçel sayılar için sayı tabanı noktasından önce bir sayı olması zorunlu değildir. .
Kayan sayıları ve bilimsel gösterimi daha kapsamlı bir şekilde desteklemek için (C / Fortran'daki birçok program veya şamandıra bu şekilde dışa aktarılacaktır), bu satıra yararlı bir ek aşağıdakiler olacaktır:
string="1.2345E-67"
if [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]?-?[0-9]+$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Böylece, belirli bir tür arıyorsanız, sayı türlerini ayırt etmenin bir yoluna yol açar:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+$ ]]
then
echo $string is an integer
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*$ ]]
then
echo $string is a float
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]-?[0-9]+$ ]]
then
echo $string is a scientific number
else
echo $string is not a number
fi
Not: Ondalık ve bilimsel gösterim için sözdizimsel gereklilikleri sıralayabiliriz. Bunlardan biri virgülün taban noktası olarak ve "." Daha sonra böyle bir sayı tabanı noktası olması gerektiğini söyleyebiliriz. Bir [Ee] şamandıra içinde iki +/- işareti olabilir. Aulu'nun çalışmasından birkaç kural daha öğrendim ve '' '-' '-E-1' '0-0' gibi kötü dizelere karşı test ettim. İşte tutunuyor gibi görünüyor regex / substring / ifade araçları:
parse_num() {
local r=`expr "$1" : '.*\([.,]\)' 2>/dev/null | tr -d '\n'`
nat='^[+-]?[0-9]+[.,]?$' \
dot="${1%[.,]*}${r}${1##*[.,]}" \
float='^[\+\-]?([.,0-9]+[Ee]?[-+]?|)[0-9]+$'
[[ "$1" == $dot ]] && [[ "$1" =~ $float ]] || [[ "$1" =~ $nat ]]
} # usage: parse_num -123.456
test && echo "foo" && exit 0 || echo "bar" && exit 1
yaklaşımın istenmeyen bazı yan etkileri olabilir - yankı başarısız olursa (belki de çıktı kapalı bir FD'ye),exit 0
atlanır ve kod daha sonra denerecho "bar"
. Eğer bu konuda da başarısız olursa,&&
durum başarısız olur ve çalışmazexit 1
! Gerçek kullanmaif
ifadeleri ziyade&&
/||
beklenmedik yan etkileri daha az eğilimli olduğunu.