明確な答えは、@ charles Dufyや他の人々によってすでに与えられています。純粋なbashソリューションは以下を使用します:
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の多くのプログラムまたはそうでなければfloatをこのようにエクスポートします)、この行への便利な追加は次のようになります:
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
注:10進表記および科学表記の構文要件をリストできます。1つは、コンマを基点として使用できること、および「。」を使用できることです。次に、そのような基数ポイントは1つだけでなければならないと断言します。[Ee] floatには2つの+/-記号を含めることができます。Auluの作業からさらにいくつかのルールを学び、 '' '-' '-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
ではなく実際のステートメントを使用すると、予期しない副作用が発生しにくくなります。&&
||