it-swarm-ja.com

シェルスクリプトで、インストールされているパッケージのバージョンを確認し、出力に基づいて決定します

PHPの強制バージョンがインストールされていることを確認するクロスディストリビューション/クロスバージョンシェルスクリプトの作成を検討中

例:Ubuntu 12.04には5.3、Ubuntu 13.10には5.5、Debian7には5.4があります

古いバージョンのPHPを持つディストリビューションで実行する場合、このスクリプトが必要です。リポジトリを更新して5.4のパッケージを指すようにします。ディストリビューションのバージョンが新しすぎる場合は、適切に5.4にダウングレードできます。

私はまだシェル/ターミナルでできることの技術的な限界を完全に包括しているわけではありませんが、既存のツールにまだ完全に慣れていないことは完全に率直です

現時点で私が考えることができる最善の方法は次のとおりです。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」が表示されます。これはまさに私が作業する必要があるものです。

3
RedactedProfile

多分いくつかの正規表現を試してください:

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

バージョン番号の比較のために、私は過去に Bash。「バージョン」形式の2つの文字列を比較する方法 から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
2
Der Hochstapler