Một câu trả lời rõ ràng đã được đưa ra bởi @charles Dufy và những người khác. Một giải pháp bash tinh khiết sẽ được sử dụng như sau:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Mặc dù đối với các số thực, không bắt buộc phải có một số trước điểm cơ số .
Để cung cấp hỗ trợ kỹ lưỡng hơn về số nổi và ký hiệu khoa học (nhiều chương trình trong C / Fortran nếu không sẽ xuất theo cách này), một bổ sung hữu ích cho dòng này sẽ là như sau:
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
Do đó, dẫn đến một cách để phân biệt các loại số, nếu bạn đang tìm kiếm bất kỳ loại cụ thể nào:
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
Lưu ý: Chúng tôi có thể liệt kê các yêu cầu cú pháp cho ký hiệu thập phân và khoa học, một là cho phép dấu phẩy dưới dạng điểm cơ số, cũng như ".". Sau đó chúng tôi sẽ khẳng định rằng chỉ có một điểm cơ số như vậy. Có thể có hai dấu +/- trong một float [Ee]. Tôi đã học được thêm một vài quy tắc từ công việc của Aulu và đã thử nghiệm các chuỗi xấu như '' '-' '-E-1' '0-0'. Dưới đây là các công cụ regex / chuỗi con / expr của tôi dường như đang giữ:
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
cách tiếp cận bạn đang sử dụng có thể có một số tác dụng phụ ngoài ý muốn - nếu tiếng vang không thành công (có lẽ là đầu ra là một FD đóng),exit 0
sẽ bị bỏ qua và sau đó mã sẽ cố gắng thực hiệnecho "bar"
. Nếu nó cũng thất bại,&&
điều kiện sẽ thất bại và thậm chí nó sẽ không thực thiexit 1
! Sử dụng cácif
tuyên bố thực tế thay vì&&
/||
ít bị tác dụng phụ không mong muốn.