1 つのアプローチは、次のように正規表現を使用することです。
re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
echo "error: Not a number" >&2; exit 1
fi
値が必ずしも整数でない場合は、正規表現を適切に修正することを検討してください。例:
^[0-9]+([.][0-9]+)?$
...または、符号付きの数値を処理するには:
^[+-]?[0-9]+([.][0-9]+)?$
誰も bash の拡張パターン マッチングを提案していません:
[[ $1 == ?(-)+([0-9]) ]] && echo "$1 is an integer"
または POSIX 文字クラスを使用:
[[ $1 == ?(-)+([[:digit:]]) ]] && echo "$1 is an integer"
次のソリューションは、正規表現を必要とせずに、Bourne などの基本的なシェルでも使用できます。基本的に、数値以外を使用した数値評価操作はエラーになり、シェルでは暗黙的に false と見なされます:
"$var" -eq "$var"
のように:
#!/bin/bash
var=a
if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
echo number
else
echo not a number
fi
$? をテストすることもできます。より明示的な操作の戻りコード:
[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null
if [ $? -ne 0 ]; then
echo $var is not number
fi
標準エラーのリダイレクトは、数値がない場合に bash が出力する「整数式が必要です」というメッセージを隠すためにあります。
注意事項 (以下のコメントに感謝します):
- 小数点のある数字は不可 有効な「数字」として識別
[[ ]]
の使用[ ]
の代わりに 常にtrue
と評価されます- ほとんどの非 Bash シェルは、この式を常に
true
と評価します。 - Bash での動作は文書化されていないため、警告なしに変更される可能性があります
- 数値の後にスペースが含まれている場合 (例:"1 a")、
bash: [[: 1 a: syntax error in expression (error token is "a")
のようにエラーが発生します。 - 値が var-name と同じ場合 (例:i="i")、
bash: [[: i: expression recursion level exceeded (error token is "i")
のようなエラーが発生します
バシズムがなければ (System V sh でも動作します)、
case $string in
''|*[!0-9]*) echo bad ;;
*) echo good ;;
esac
これにより、空の文字列と数字以外を含む文字列が拒否され、それ以外はすべて受け入れられます。
負数または浮動小数点数には、追加の作業が必要です。アイデアは -
を除外することです / .
最初の「悪い」パターンで、それらの不適切な使用を含む「悪い」パターンをさらに追加します (?*-*
/ *.*.*
)