Проверить, если версия yad> = конкретный номер версии

Мне нужен скрипт, чтобы проверить, соответствует ли номер версии 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.
  • Для yad добавлены новые функции между Ubuntu 16.04 и 19.04
  • Для gedit возможность чтобы передать геометрию окна теряется в более новых версиях
  • bash усложняет тесты, так как номер версии находится в середине первой строки.

Переменная среды не будет существовать для всех программ, подобных bash:

$ echo $BASH_VERSION
5.0.3(1)-release
2
задан 5 August 2019 в 21:53

3 ответа

Вы могли бы хотеть попробовать GNU sort -V (--version-sort), наряду с -C (--check=quiet):

$ echo $BASH_VERSION
4.4.20(1)-release

затем возвратиться 0 (верный), если версия, по крайней мере, учитывая одну и 1 (ложь) иначе:

$ 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
3
ответ дан 2 December 2019 в 01:52

Я разработал сценарий, который привлекает ответы в Переполнении стека. Один из тех ответов, ведомых к Сотруднику Dell, пишущему сравнения номера версии в 2004 для приложения DKMS.

Демонстрационные тесты

$ 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

Код

Сценарий удара ниже должен быть отмечен как исполняемый файл с помощью команды 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
1
ответ дан 2 December 2019 в 01:52

Можно использовать dpkg --compare-versions. Пример использования:

$ dpkg --compare-versions 4.0 lt 5.0 && echo true
true

Это возвращает "true", потому что версия 4.0 является меньше, чем ("лейтенант") версия 5.0.

С другой стороны, следующее ничего не возвращает:

$ dpkg --compare-versions 4.0 gt 5.0 && echo true

Это вызвано тем, что версия 4.0 не больше ("gt"), чем 5,0.

Операторы сравнения для dpkg --compare-versions :

  • lt le eq ne ge gt (рассматривайте пустую версию как ранее, чем какая-либо версия);
  • lt-nl le-nl ge-nl gt-nl (рассматривайте пустую версию как позже, чем какая-либо версия);
  • < << <= = >= >> > (только для совместимости с синтаксисом файла управления).
1
ответ дан 2 December 2019 в 01:52

Другие вопросы по тегам:

Похожие вопросы: