Jawaban yang jelas telah diberikan oleh @charles Dufy dan lainnya. Solusi bash murni akan menggunakan yang berikut:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Meskipun untuk bilangan real tidak wajib memiliki nomor sebelum titik radix .
Untuk memberikan dukungan yang lebih menyeluruh tentang angka mengambang dan notasi ilmiah (banyak program di C / Fortran atau yang akan mengekspor float dengan cara ini), tambahan yang bermanfaat untuk baris ini adalah sebagai berikut:
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
Jadi mengarah ke cara untuk membedakan jenis angka, jika Anda mencari jenis tertentu:
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
Catatan: Kita dapat membuat daftar persyaratan sintaksis untuk notasi desimal dan ilmiah, satu untuk memungkinkan koma sebagai titik radix, serta "." Kami kemudian akan menegaskan bahwa harus ada hanya satu titik radix tersebut. Mungkin ada dua tanda +/- dalam float [Ee]. Saya telah belajar beberapa aturan lagi dari karya Aulu, dan menguji terhadap string buruk seperti '' '-' '-E-1' '0-0'. Berikut adalah alat regex / substring / expr saya yang tampaknya bertahan:
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
pendekatan yang Anda gunakan mungkin memiliki beberapa efek samping yang tidak diinginkan - jika gema gagal (mungkin output ke FD tertutup), makaexit 0
akan dilewati, dan kode kemudian akan mencobaecho "bar"
. Jika gagal juga,&&
kondisinya akan gagal, dan itu bahkan tidak akan dieksekusiexit 1
! Menggunakanif
pernyataan aktual daripada&&
/||
kurang rentan terhadap efek samping yang tidak terduga.