如何在 shell 脚本中检查软件版本?

CR4*_*R47 5 bash shell sh

我的 bash 脚本中有两个软件版本检查没有按我预期的那样工作。

DRUSH_VERSION="$(drush --version)"
echo ${DRUSH_VERSION}
if [[ "$DRUSH_VERSION" == "Drush Version"* ]]; then
    echo "Drush is installed"
  else
    echo "Drush is NOT installed"
fi
GIT_VERSION="$(git --version)"
echo ${GIT_VERSION}
if [[ "GIT_VERSION" == "git version"* ]]; then
    echo "Git is installed"
  else
    echo "Git is NOT installed"
fi
Run Code Online (Sandbox Code Playgroud)

回复:

Drush Version : 6.3.0
Drush is NOT installed
git version 1.8.5.2 (Apple Git-48)
Git is NOT installed
Run Code Online (Sandbox Code Playgroud)

同时,如果我改变

DRUSH_VERSION="${drush --version)"

DRUSH_VERSION="Drush 版本:6.3.0"

它回应

Drush 已安装

现在我将使用

如果输入 -p drush;

但我还是想得到版本号。

Dav*_*ica 6

有几个问题可以解决。首先,如果您不关心可移植性,那么您想使用子字符串匹配运算符=~而不是==。那会发现git versiongit version 1.8.5.2 (Apple Git-48)$其次,你的测试中缺少了一个[[ "GIT_VERSION" == "git version" ]]

因此,例如,如果您按如下方式更改测试,则可以匹配子字符串。(注意:=~适用于运算符[[ ]],您需要删除所有通配符*)。

if [[ "$DRUSH_VERSION" =~ "Drush Version" ]]; then
...
if [[ "$GIT_VERSION" =~ "git version" ]]; then
...
Run Code Online (Sandbox Code Playgroud)

此外,如果您只是检查程序是否存在而不是特定版本号,那么您最好使用:

if which $prog_name 2>/dev/null; then...
Run Code Online (Sandbox Code Playgroud)

或使用复合命令:

which $prog_name && do something found || do something not found
Run Code Online (Sandbox Code Playgroud)

例如对于git

if which git 2>/dev/null; then
...
Run Code Online (Sandbox Code Playgroud)

或者

which git && echo "git found" || echo "git NOT found"
Run Code Online (Sandbox Code Playgroud)

注意:重定向stderr/dev/null只是防止错误$prog_name在系统上不存在的情况下从屏幕上喷出。