バージョンを比較する方法は次のとおりです。
使用sort -V
:
function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; }
使用例:
first_version=5.100.2
second_version=5.1.2
if version_gt $first_version $second_version; then
echo "$first_version is greater than $second_version !"
fi
プロ:
- ファンシーなバージョン文字列を比較する確かな方法:
- 任意の長さのサブパーツをサポート (つまり: 1.3alpha.2.dev2 > 1.1 ?)
- アルファベット順のソートをサポート (例: 1.alpha < 1.beta2)
- 大きなサイズのバージョンをサポート (例: 1.10003939209329320932 > 1.2039209378273789273 ?)
- n 引数をサポートするように簡単に変更できます。(演習として残しておきます ;) )
- 通常、3 つの引数で非常に便利です: (つまり: 1.2 < my_version < 2.7 )
短所:
- さまざまなプログラムへのさまざまな呼び出しを多数使用します。だから効率が悪いのです。
- のかなり最近のバージョンを
sort
使用しており、お使いのシステムでは利用できない可能性があります。( で確認man sort
)
なしsort -V
:
## each separate version number must be less than 3 digit wide !
function version { echo "$@" | gawk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }'; }
使用例:
first_version=5.100.2
second_version=5.1.2
if [ "$(version "$first_version")" -gt "$(version "$second_version")" ]; then
echo "$first_version is greater than $second_version !"
fi
プロ:
- 1つのサブプロセスのみを呼び出すため、より迅速なソリューション
- はるかに互換性のあるソリューション。
短所:
- 非常に具体的なバージョン文字列は次のようにする必要があります。
- 1、2、または 3 パーツのみのバージョンがあります。(「2.1.3.1」を除く)
- 各部分は数値のみでなければなりません (「3.1a」を除く)
- 各部分は 999 を超えることはできません (「1.20140417」を除く)
スクリプトに関するコメント:
それがどのように機能するかわかりません:
- コメントに記載されているように、
>
非常<
に特別なシェル文字であり、それらを-gt
およびに置き換える必要があります-lt
- 文字を置き換えたとしても、整数または浮動小数点数のようにバージョン番号を比較することはできません。たとえば、私のシステムでは、php のバージョンは
5.5.9-1ubuntu4
.
しかし、あなたの関数version()
はすでに非常に巧妙に書かれており、数字をアルファベット順にソートしても数字が数字でソートされないという古典的な問題を回避するのに役立つかもしれません (アルファベット順で 1 < 11 < 2、これは数字的に間違っています)。ただし、注意してください: bash では、任意に大きな数値はサポートされていません (32 ビット システムとの互換性を目指す場合は、32 ビット未満に保つようにしてください。したがって、9 桁の長い数値になります)。sort -V
したがって、バージョン文字列の各部分に 3 桁のみを強制するように(2 番目の方法では を使用せずに) コードを変更しました。
EDIT : @phk 改善を適用しました。これは、著しく賢く、最初のバージョンでsort
. ありがとう。