1. ホーム
  2. string

[解決済み] 文字列が有効な整数であるかどうかをテストする

2022-07-06 19:53:39

質問

私は一般的なことをしようとしています。シェル スクリプトでユーザー入力を解析します。ユーザーが有効な整数を提供した場合、スクリプトは 1 つのことを行い、有効でない場合は他のことを行います。問題は、これを行う簡単な (そして適度にエレガントな) 方法をまだ見つけられていないことです - 文字ごとに分解する必要はありません。

これが簡単でなければならないことは分かっていますが、方法が分かりません。1 ダースもの言語でそれを行うことができましたが、BASH ではできません!

調べてみると、こんなものがありました。

文字列が基数10の有効な実数から構成されているかどうかをテストする正規表現

そして、そこには正規表現について語る回答がありますが、私の知る限り、それはCで利用可能な関数です(他の関数と比較して)。それでも、それは素晴らしい答えのように見えたので、私はそれをgrepで試してみましたが、grepはそれをどうしたらいいのかわかりませんでした。私のマシンでは、PERL正規表現として扱うことを意味する-Pを試しましたが、ダメでした。ダッシュE(-E)もうまくいかなかった。そして、-Fもダメでした。

はっきりさせておきたいのですが、私はこのようなことを試して、何か出力がないか探しています。(つまり、有効な行が繰り返される一方で、不適合な入力は何も返さないと予想していました。)

snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
   echo "Not an integer - nothing back from the grep"
else
   echo "Integer."
fi

どなたか、これが最も簡単にできる方法を教えていただけませんか?

率直に言って、これはTESTの欠点だと私は思います。このようなフラグを持つべきです。

if [ -I "string" ] ;
then
   echo "String is a valid integer."
else
   echo "String is not a valid integer."
fi

どのように解決するのですか?

[[ $var =~ ^-?[0-9]+$ ]]

  • ^ は入力パターンの先頭を示します。
  • - はリテラルな "-" です。
  • ? は、0または1個の先行する( - )"を意味します。
  • + は、"前の1つ以上の( [0-9] )"を意味する。
  • $ は入力パターンの終わりを示します。

つまり、正規表現がマッチするのはオプションの - (負の数の場合)、その後に一つ以上の小数点以下の数字が続きます。

参考文献 :