希望编写一个跨发行版/跨版本的 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