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

6

我在我的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

响应:

Drush Version : 6.3.0
Drush is NOT installed
git version 1.8.5.2 (Apple Git-48)
Git is NOT installed

同时,如果我将

DRUSH_VERSION="${drush --version)"

更改为

DRUSH_VERSION="Drush版本:6.3.0"

它会回复

Drush已安装

现在我将使用

if type -p drush;

但我仍然想获取版本号。


2
第二个 if 中的 "GIT_VERSION" 应该改为 "$GIT_VERSION"。通过这个修复,我成功地进行了检查。我没有安装 "drush"。尝试使用 echo "${DRUSH_VERSION}"(带引号)来查看是否存在奇怪的空格。 - Nemo
@Nemo,git检查现在可以工作了,但Drush检查不行。我执行echo ${DRUSH_VERSION},它没有问题地打印出来了。 - CR47
2
不要无引号地回显它。像我的注释中那样加上引号。否则,shell会在空格处分割它,将多个参数传递给echo,这可能会让你困惑。 - Nemo
你确定 Drush 版本是来自于你的 echo 吗?如果它打印到 stderr,你无论如何都会看到输出,但你的 echo 只会产生一个空行。不管怎样,如果这个猜想是正确的,修复很容易;只需添加一个 2>&1 重定向。 - tripleee
如果 echo 没有生成代码,输出中将会有一行空白,因为 echo $DRUSH_VERSION 意味着打印一个换行符。 - chepner
显示剩余2条评论
2个回答

6
有几个问题需要解决。首先,如果您不关心可移植性,那么您应该使用子字符串匹配运算符=~而不是==。这将在git version 1.8.5.2 (Apple Git-48)中找到git version。其次,在您的[[ "GIT_VERSION" == "git version" ]]测试中缺少一个$
例如,如果您按以下方式更改测试,则可以匹配子字符串。(注意: =~仅适用于[[ ]]运算符,并且您需要删除任何通配符*)。
if [[ "$DRUSH_VERSION" =~ "Drush Version" ]]; then
...
if [[ "$GIT_VERSION" =~ "git version" ]]; then
...

此外,如果您只是想检查一个程序是否存在而不是特定的版本号,那么最好使用以下方法:

if which $prog_name 2>/dev/null; then...

或者使用复合命令:

which $prog_name && do something found || do something not found

例如,对于git
if which git 2>/dev/null; then
...

或者

which git && echo "git found" || echo "git NOT found"

注意:stderr 重定向到 /dev/null 只是为了防止在系统上不存在 $prog_name 的情况下,错误信息在屏幕上乱窜。


1
“[[” 已经是非可移植的了,所以切换到“=~”不会有任何成本。 - chepner

1

在 if 条件语句中,你错过了将它作为变量引用,应该使用 ${DRUSH_VERSION} 而不是 "$DRUSH_VERSION"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接