$ 1が/ bin/dash内の整数であるかどうかを確認する最良の方法は何ですか?
Bashでは、次のことができます。
[[ $1 =~ ^([0-9]+)$ ]]
しかし、それはPOSIXに準拠していないようで、ダッシュはそれをサポートしていません
以下は、正または負の整数を検出し、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
("ボーンシェルの再実装 "sh
); case
構文は、最も広く利用可能で信頼性の高いものです。
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
文字列に対して-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
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
算術展開として使用してみて、機能するかどうかを確認してください。たとえば、算術展開では先頭と末尾のスペースが無視されるため、実際にはそれよりも少し厳密にする必要があります。算術展開を行い、展開結果が元の変数と正確に一致することを確認してください。
_check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
_
これは負の数も受け入れます-本当にそれらを除外するつもりなら、$((${1} >= 0))
に追加のチェックを追加します。
おそらくexpr
?
if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
echo "integer"
else
echo "non-integer"
fi
POSIXシステムでは、 expr を使用できます。
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer