回答:
以下は正または負の整数を検出し、dash
POSIXで動作します:
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
または、:
(nop)コマンドを少し使用して:
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
かどうかdash
、bash
、ksh
、zsh
、POSIX sh
、またはposh
("Bourneシェルの再実装" sh
)。case
構築物は、最も広く利用可能性と信頼性です。
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
dash
か?それは私の下で動作しますbash
が、動作しませんdash
。
dash
; echo $?
caseコマンドの後に追加した結果を調べるために。
posh
(「Bourneシェルの再実装」)も、このソリューションでは問題ありません。
case
ます。1つの理由は、あなたが説明するバグ、もう1つは一致する括弧(vim)に依存する機能を備えたエディターでは、より優れたサポートを提供することです。-WRT posh
はPOSIXです。まあ、私が与えたmanページからの引用は何か他のものを示唆しましたが、とにかくそのような非公式のステートメントに頼ることはできません。とにかく古いボーンシェルは、私たちがPOSIX時代になった今ではそれほど重要ではありません。
あなたは-eq
それ自身で文字列のテストを使うことができます:
$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number
エラーメッセージに問題がある場合は、エラー出力をにリダイレクトします/dev/null
。
$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
" 023 "
数字だと言うでしょう。ダッシュで動作しますが、オペランドがノート10進整数の場合の動作は指定されていないため、他のすべてのPOSIXシェルでは動作しないことに注意してください。たとえば、kshの場合、それはSHLVL
or 1+1
と数字になります。
算術展開として使用してみて、動作するかどうかを確認してください。実際には、算術展開では、たとえば先頭と末尾のスペースが無視されるため、それより少し厳密にする必要があります。したがって、算術展開を行い、展開された結果が元の変数と正確に一致することを確認してください。
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
これは、負の数も受け入れます。本当に除外する場合は、の追加チェックを追加し$((${1} >= 0))
ます。
[[
$(( ... ))
か?もしそうなら、私の答えはまだ実質的に正しいはずです、私はいくつかの余分な引用符を追加する必要があります。
check_if_number 1.2
と関数が返されました: dash: 3: arithmetic expression: expecting EOF: "1.2"
POSIXシステムでは、exprを使用できます。
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
expr
実装では、9999999999999999999は整数ではないと言います。POSIXは、これが機能することを保証しません。実際には、少なくともGNUシステムでは、「長さ」は整数であると言われます。
expr 9999999999999999999 + 0
私に3終了ステータスを与え、expr -12 + 0
そしてexpr length + 0
私のGNU exprの0終了ステータスを(与える+ string
力はstring
GNUの文字列として考えることにするexpr
。expr "$a" - 0
よりよく機能するであろう)。
-12
は有効な整数であり9999999999999999999
、オーバーフローを与えたと思います。
muruの答えと同じ方法を使用した簡単な関数を次に示します。
IsInteger() # usage: IsInteger string
{ # returns: flag
[ "$1" -eq "$1" ] 2> /dev/null
}
例:
p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
出力:
'2a3' isn't an integer
'23' is an integer
foo\n123\nbar
整数ではありませんが、このテストに合格します。