1

次のプログラムは、最初のパラメーターが数値かどうかをチェックします。これまでに思いついた最高のものは次のとおりです。

#/bin/bash
if (( $# )) && (( $1 != 0 )) ; then
    echo "number"
else
    echo "not number"
fi
  • 1これは、-1、 、 などの数値100、文字列aabca431、またはパラメーターが指定されていない場合に機能します。

  • 、、などの文字列の警告で動作します1a11.3-1.2

  • しかし、パラメータ0

これはどのように修正できますか?(演算式を使用)

関連: Bash 整数比較

4

5 に答える 5

2

組み込みコマンドを押して、printf次の作業を実行できます。

if printf "%d" ${1:-foo} > /dev/null; then
    echo "number"
else
    echo "NOT a number"
fi

printf変換が失敗した場合、ゼロ以外のステータスで終了します。が設定されていない場合、${1-...}表記は既知のnot-numberを提供します$1

于 2013-01-25T14:19:38.437 に答える
1

私はむしろ次のようなものを使用したい

if [ $1 = "$(echo $1 | awk '{print strtonum($0)}')" ]; then
echo "number"
else
echo "not number"
fi
于 2013-01-25T03:22:47.457 に答える
1

数値ではないものをテストする方が簡単かもしれません:

if (( $# )) ; then
  if [[ $1 == *[^0-9]* ]] ; then
    echo "Not a number"
  else
    echo "Is a number"
  fi
fi

上記は実際には正の整数のみをテストしていることに注意してください。+- を追加します。文字クラスに追加すると、正/負の整数と小数に対して機能します。123.456.789 が数値として渡されるため、そう言っていますが、有効ではありません。間違った場所または複数の記号と小数点 (および "+"、"." などの文字列) を取り除くために、追加のロジックを追加する必要があります。

于 2013-01-25T14:54:05.863 に答える
1

拡張グロブを使用したソリューション

#/bin/bash
shopt -s extglob
if [[ $1 = *[0-9]* && $1 = ?([+-])*([0-9])?(.*([0-9])) ]]; then
    echo "Is a number"
else
    echo "Not a number"
fi

出力

$ ./test -1
Is a number
$ ./test 0
Is a number
$ ./test 1
Is a number
$ ./test a
Not a number
$ ./test -1.2
Is a number
$ ./test 0.0
Is a number
$ ./test 1.2
Is a number
$ ./test a.b
Not a number
于 2013-01-25T05:52:06.900 に答える
1

正規表現を使用できます:

#/bin/bash

if [[ "$1" =~ ^-?[0-9]+$ ]] ; then
    echo "number"
else
    echo "not number"
fi

浮動小数点を処理したい場合は、簡単に微調整できます。

#/bin/bash

if [[ "$1" =~ ^-?[0-9]+$ || "$1" =~ ^-?[0-9]*\.[0-9]+ ]] ; then
    echo "number"
else
    echo "not number"
fi
于 2013-01-25T03:49:48.107 に答える