Bashシェルスクリプトで数値(小数を含む)かどうかを判定する方法
はじめに
関連したエントリは今まで何度もしていますが、特定のケースに限定した「こんなときどうする?」集の1つとしてまとめてみました。
今回は 変数 や ファイルのコンテンツ などが数字以外が含まれていないことを判定する方法を紹介します。
検証環境
$ uname -moi
aarch64 aarch64 GNU/Linux
$ head -n 3 /etc/os-release
PRETTY_NAME="Ubuntu Kinetic Kudu (development branch)"
NAME="Ubuntu"
VERSION_ID="22.10"
$ bash -version | head -n 1
GNU bash, バージョン 5.1.16(1)-release (aarch64-unknown-linux-gnu)
$ grep --version | head -n 1
grep (GNU grep) 3.7
grep
を用いた正規表現で判定する
小数を考慮した実数を判定するための正規表現を利用するのが最もかんたんです。
$ VAR=123
$ grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"$VAR" && echo "数値ですよ"
数値ですよ
-q
オプションについては過去のエントリでも紹介しています。
-E
オプションはエスケープ文字列 \\
が大量に登場しそうな場合に完結に記述するための拡張表現有効化オプションです。
いろいろな数値文字列で動作を確認してみます。
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"0" && echo "数値ですよ"
数値ですよ
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"123" && echo "数値ですよ"
数値ですよ
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"-123" && echo "数値ですよ"
数値ですよ
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"123.4" && echo "数値ですよ"
数値ですよ
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"0.5" && echo "数値ですよ"
数値ですよ
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"-0.0102" && echo "数値ですよ"
数値ですよ
# 何も出力されない
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"1x23" && echo "数値ですよ"
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"12+3" && echo "数値ですよ"
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"123-" && echo "数値ですよ"
grep -Eq '^-?[1-9]*[0-9](\.[0-9]+)?$' <<<"1.2.3" && echo "数値ですよ"
ひとこと
grep
を利用しない方法ももちろんあるでしょうが、今回はかんたんな方法だけ紹介するにとどめます。
ディスカッション
コメント一覧
まだ、コメントがありません