yad (および他のプログラム)のバージョン番号が特定の番号以上かどうかを確認するスクリプトが必要です。たとえば、私は持っています:
$ yad --version
0.40.0 (GTK+ 3.24.8)
$ gedit --version
gedit - Version 3.32.0
$ bash --version
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
環境変数は、bashが持っているようなすべてのプログラムに対して存在しない:
$ echo $BASH_VERSION
5.0.3(1)-release
GNU sort
's -V
(--version-sort
)と-C
(--check=quiet
)を試してみてください。
$ echo $BASH_VERSION
4.4.20(1)-release
次に、バージョンが指定されたバージョン以上の場合は0
(true)を返し、それ以外の場合は1
(false)を返します。
$ printf '%s\n%s\n' "$BASH_VERSION" "4.3" | sort -rVC ; echo $?
0
$ printf '%s\n%s\n' "$BASH_VERSION" "4.4.20(2)" | sort -rVC ; echo $?
1
dpkg --compare-versions
を使用できます。使用例:
$ dpkg --compare-versions 4.0 lt 5.0 && echo true
true
バージョン4.0はバージョン5.0(「lt」)より小さいため、これは「true」を返します。
一方、次のものは何も返しません。
$ dpkg --compare-versions 4.0 gt 5.0 && echo true
これは、バージョン4.0が5.0より大きくない( "gt")ためです。
dpkg --compare-versions
の比較演算子は次のとおりです。
lt le eq ne ge gt
(空のバージョンをどのバージョンよりも前のバージョンとして扱います);lt-nl le-nl ge-nl gt-nl
(空のバージョンはどのバージョンよりも後のバージョンとして扱います);< << <= = >= >> >
(制御ファイル構文との互換性のためにのみ)。Stack Overflowで回答を利用するスクリプトを開発しました。これらの答えの1つが、DKMSアプリケーションのバージョン番号の比較を2004年に書いているデルの従業員につながりました。
$ testver yad 0.40.0; echo $?
0
$ testver yad 0.41.0; echo $?
1
$ testver bash 5.0.3; echo $?
0
$ testver bash 5.0.4; echo $?
1
$ testver gedit 3.32.0; echo $?
0
$ testver gedit 4.32.0; echo $?
1
$ testver iwconfig 30; echo $?
0
$ testver iwconfig 31; echo $?
1
if testver gnome-Shell 3.32.0 ; then
# returns 0 version 3.32.0 and greater geometry not supported.
Nohup gedit $@ &>/dev/null &
else
# returns 1 version less than 3.32.0 so geometry supported.
Nohup gedit -g 1300x840+4565+2345 $@ &>/dev/null &
fi
以下のbashスクリプトは、chmod a+x script-name
コマンドを使用して実行可能としてマークする必要があります。 /usr/local/bin/testver
という名前を使用しています:
#!/bin/bash
# NAME: testver
# PATH: /usr/local/bin
# DESC: Test a program's version number >= to passed version number
# DATE: May 21, 2017. Modified August 5, 2019.
# CALL: testver Program Version
# PARM: 1. Program - validated to be a command
# 2. Version - validated to be numberic
# NOTE: Extracting version number Perl one-liner found here:
# http://stackoverflow.com/questions/16817646/extract-version-number-from-a-string
# Comparing two version numbers code found here:
# http://stackoverflow.com/questions/4023830/how-compare-two-strings-in-dot-separated-version-format-in-bash
# Map parameters to coder-friendly names.
Program="$1"
Version="$2"
# Program name must be a valid command.
command -v $Program >/dev/null 2>&1 || { echo "Command: $Program not found. Check spelling."; exit 99; }
# Passed version number must be valid format.
if ! [[ $Version =~ ^([0-9]+\.?)+$ ]]; then
echo "Version number: $Version has invalid format. Aborting.";
exit 99
fi
InstalledVersion=$( "$Program" --version | Perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
# Perl command doesn't work for non-decimal version numbers
[[ "$InstalledVersion" == "" ]] &&
InstalledVersion=$( "$Program" --version | head -n1 | tr -dc '0-9')
if [[ $InstalledVersion =~ ^([0-9]+\.?)+$ ]]; then
l=(${InstalledVersion//./ })
r=(${Version//./ })
s=${#l[@]}
[[ ${#r[@]} -gt ${#l[@]} ]] && s=${#r[@]}
for i in $(seq 0 $((s - 1))); do
# echo "Installed ${l[$i]} -gt Test ${r[$i]}?"
[[ ${l[$i]} -gt ${r[$i]} ]] && exit 0 # Installed version > test version.
[[ ${l[$i]} -lt ${r[$i]} ]] && exit 1 # Installed version < test version.
done
exit 0 # Installed version = test version.
else
echo "Invalid version number: $InstalledVersion found for command: $Program"
exit 99
fi
echo "testver - Unreachable code has been reached!"
exit 255