私は十分に一般的なことをしようとしています:シェルスクリプトでユーザー入力を解析します。ユーザーが有効な整数を指定した場合、スクリプトは1つの処理を実行し、無効な場合は別の処理を実行します。問題は、これを行う簡単な(そして合理的にエレガントな)方法を見つけていないことです。1文字ずつ個別に選択する必要はありません。
これは簡単なはずですが、方法はわかりません。私は12の言語でそれを行うことができましたが、BASHはできませんでした!
私の研究でこれを見つけました:
文字列が10進数の有効な実数で構成されるかどうかをテストする正規表現
そして、そこには正規表現についての答えがありますが、私の知る限り、それはCで利用可能な関数です(とりわけ)。それでも、すばらしい答えのように見えたので、grepで試してみましたが、grepはそれをどうするかわかりませんでした。私の箱では、それをPERL正規表現として扱うことを意味する-Pを試しました-nada。ダッシュE(-E)も機能しませんでした。また、-Fも行いませんでした。
明確にするために、私はこのようなものを試して、出力を探しています-そこから、取得したものを利用するためにスクリプトをハッキングします。(IOW、有効な行が繰り返されている間は、非準拠の入力が何も返さないことを期待していました。)
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
[
旧互換test
です。[[
より多くの操作とさまざまな引用ルールを備えたBashの新しいものです。すでにBashを使用することに決めている場合は、それを実行してください[[
(これは非常に優れています)。他のシェルへの移植性が必要な場合は、[[
完全に避けてください。