GNU/Linux >> Linux の 問題 >  >> Linux

Bashで変数が数値かどうかをテストするにはどうすればよいですか?

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

これにより、空の文字列と数字以外を含む文字列が拒否され、それ以外はすべて受け入れられます。

負数または浮動小数点数には、追加の作業が必要です。アイデアは - を除外することです / . 最初の「悪い」パターンで、それらの不適切な使用を含む「悪い」パターンをさらに追加します (?*-* / *.*.* )


Linux
  1. バンをエコーする方法!?

  2. Bash スクリプトへのすべてのコマンドライン引数を 1 つの変数に格納したい

  3. Linux bash:複数の変数の割り当て

  1. Bashスクリプト(I)

  2. Bash変数の文字数をカウントするにはどうすればよいですか

  3. bashはどのように「false」をテストしますか?

  1. Bashで文字列を16進数として読み取る方法は?

  2. Bashシェルスクリプトで改行をエコーする方法

  3. BASH:パイプ内の数値に対して算術演算を実行する方法