В сценариях оболочки проверьте версию установленного пакета, примите решение на основе вывода


3

Нужно написать сценарий кросс-дистрибутивной / кросс-версии, который обеспечит установку принудительной версии PHP

Пример: Ubuntu 12.04 имеет 5,3, Ubuntu 13.10 имеет 5,5, Debian 7 имеет 5,4

Мне нужен этот сценарий, когда он запускается в дистрибутиве, который имеет старую версию PHP, чтобы обновить репозиторий, чтобы он указывал на пакет для 5.4, и, если дистрибутив имеет слишком новую версию, может соответствующим образом понизиться до 5.4.

Я до сих пор не совсем разбираюсь в технических ограничениях Shell / Terminals относительно того, что вы можете с ним делать, но я должен быть совершенно откровенен, что я все еще не полностью привык к существующим инструментам

Лучшее, что я могу думать на данный момент: php -v | grep "PHP 5"но это возвращает кучу потенциально изменяемых гранулированных символов (PHP 5.4.4-14+deb7u5 (cli) (built: Oct 3 2013 09:24:58) ). Я не уверен, к чему обратиться после этого, чтобы извлечь персонажей, которые им интересны

Я не уверен, что если я полностью ясен, я не уверен, как спросить это .. В основном, в автоматическом сценарии оболочки для дистрибутивов Linux, как мне извлечь версию PHP (и просто номер версии PHP предпочтительно) и принять решение на основе на этом выходе

РЕДАКТИРОВАТЬ

Эта линия в конечном итоге делает чертовски хорошо

php -v | grep "PHP 5" | sed 's/.*PHP \([^-]*\).*/\1/' | cut -c 1-3

Немного длиннее в зубе, но дает мне "5.3", "5.4" и "5.5", что именно то, что мне нужно для работы

Ответы:


2

Попробуйте некоторые регулярные выражения, возможно:

php -v|grep --only-matching --perl-regexp "5\.\\d+\.\\d+"

Для сравнения номеров версий в прошлом я использовал скрипт bash от Bash. Как сравнить две строки в формате «версия»

Полный сценарий

Я решил пойти с вашим подходом, потому что это казалось немного безопаснее. Я также добавил пример того, как применить указанный скрипт здесь. Итак, вот полный пример:

#!/bin/bash

# Version number compare helper function
# Created by Dennis Williamson (https://stackoverflow.com/questions/4023830/bash-how-compare-two-strings-in-version-format)
function compareVersions() {
  if [[ $1 == $2 ]]
  then
    return 0
  fi
  local IFS=.
  local i ver1=($1) ver2=($2)
  # fill empty fields in ver1 with zeros
  for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
  do
    ver1[i]=0
  done
  for ((i=0; i<${#ver1[@]}; i++))
  do
    if [[ -z ${ver2[i]} ]]
    then
      # fill empty fields in ver2 with zeros
      ver2[i]=0
    fi
    if ((10#${ver1[i]} > 10#${ver2[i]}))
    then
      return 1
    fi
    if ((10#${ver1[i]} < 10#${ver2[i]}))
    then
      return 2
    fi
  done
  return 0
}

if ! hash php 2>&-; then
  echo "php is not installed!"
  exit 1
fi

PHP_VERSION=$(php -v | grep "PHP 5" | sed 's/.*PHP \([^-]*\).*/\1/' | cut -c 1-3)
echo "Installed PHP version: '$PHP_VERSION'"

set +e errexit
compareVersions $PHP_VERSION 5.4
_versionsEqual=$?
set -e errexit

case $_versionsEqual in
  0)
    # Versions equal, nothing to do
    echo "The installed version is 5.4 and doesn't need to be adjusted."
    ;;
  1)
    # Installed version is newer than 5.4
    echo "The installed version is newer than 5.4 and needs to be downgraded."
    ;;
  2)
    # Installed version is older then 5.4
    echo "The installed version is older than 5.4 and needs to be upgraded."
    ;;
esac

Это тоже прекрасно работает
RedactedProfile

Я бы написал вам более полный пример, но кошка стучит по моему стулу.
Der Hochstapler

1
@DJDarkViper: я сейчас добавил пример
Der Hochstapler
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.