Bashシェルスクリプトで数値(小数を含む)かどうかを判定する方法

2023-03-27Bash

はじめに

関連したエントリは今まで何度もしていますが、特定のケースに限定した「こんなときどうする?」集の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 を利用しない方法ももちろんあるでしょうが、今回はかんたんな方法だけ紹介するにとどめます。

2023-03-27Bash