質問: シェルスクリプトで、インストールされているパッケージのバージョンを確認し、出力に基づいて決定します 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」が表示されます。これはまさに私が作業する必要があるものです。
回答: 多分いくつかの正規表現を試してください: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