在 Shell 脚本中,检查已安装包的版本,根据输出做出决定

在 Shell 脚本中,检查已安装包的版本,根据输出做出决定

希望编写一个跨发行版/跨版本的 shell 脚本,以确保安装强制版本的 PHP

例如:Ubuntu 12.04 有 5.3,Ubuntu 13.10 有 5.5,Debian 7 有 5.4

我需要这个脚本,当在具有旧版本 PHP 的发行版上运行时,更新 repo 以指向 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 发行版的自动化 shell 脚本中,我如何提取 PHP 版本(最好只是 PHP 版本号)并根据该输出做出决定。

这条线路最终取得了不错的成绩

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

有点过时了,但给了我“5.3”、“5.4”和“5.5”,这正是我需要的

答案1

也许可以尝试一些正则表达式:

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

为了比较版本号,我过去曾使用过来自Bash。如何比较“version”格式的两个字符串

完整脚本

我决定采用你的方法,因为它看起来更安全一些。我还在这里添加了一个如何应用引用脚本的示例。以下是完整的示例:

#!/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

相关内容