Чітку відповідь вже дали @charles Dufy та інші. Чистим розчином баша буде використання наступного:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Хоча для дійсних чисел не обов’язково мати число перед точкою радіусу .
Щоб надати більш ретельну підтримку плаваючих чисел та наукових позначень (багато програм у C / Fortran або ще експортуватимуть плавати таким чином), корисним доповненням до цього рядка буде наступне:
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
Таким чином, ведучи до способу диференціювання типів чисел, якщо ви шукаєте конкретний тип:
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
Примітка. Ми можемо перерахувати синтаксичні вимоги до десяткової та наукової нотації, одна з яких повинна дозволити кому як точку радіації, а також ".". Тоді ми б стверджували, що повинна бути лише одна така точка радіусу. У плавці [Ee] може бути два знаки +/-. Я дізнався ще кілька правил з роботи Аулу і перевірив погані рядки, такі як '' '-' '-E-1' '0-0'. Ось мій інструмент regex / substring / expr, який, здається, тримає:
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
підхід, який ви використовуєте, може мати деякі непередбачувані побічні ефекти - якщо відлуння не вдасться (можливо, вихід виходить із закритого FD),exit 0
пропуск буде пропущений, і код спробуєecho "bar"
. Якщо це теж&&
не вдасться, умова вийде з ладу, і вона навіть не виконаєтьсяexit 1
! Використання фактичнихif
тверджень, а не&&
/||
менш схильне до несподіваних побічних ефектів.