如何修复 bash 中检查 RPM 包是否已安装的功能?

如何修复 bash 中检查 RPM 包是否已安装的功能?

我已经写了这个函数:

function isInstalled {
if [ rpm -q $1 &> /dev/null ]; then
    echo 'installed';
    return 1;
else
    echo 'not installed';
    return 0;
fi
}

但有些地方不对劲。它总是返回 0。即使安装了包也是如此。我想我没有正确检查返回信号。

[vagrant@centos-7 ~]$ isInstalled wget2
not installed
[vagrant@centos-7 ~]$ isInstalled wget
not installed

[vagrant@centos-7 ~]$ rpm -q wget
wget-1.14-10.el7_0.1.x86_64

答案1

if [ rpm -q ... &> /dev/null ]是内置命令的无效使用[。如果您没有重定向 stderr,您会在错误消息中看到此内容,如下所示:

if [ rpm -q $1 >/dev/null ]; then

您执行的每个命令都有一个退出代码,因此无需包装[ ... ],并且这是无效的语法。

这样写:

isInstalled() {
    if rpm -q $1 &> /dev/null; then
        echo 'installed';
        return 1;
    else
        echo 'not installed';
        return 0;
    fi
}

答案2

你的函数应该写成

isInstalled() {
    if rpm -q "$1" >/dev/null ; then
        echo "installed"
        return 0
    else
        echo "not installed"
        return 1
    fi
}

笔记:

  • 定义函数的更可移植的语法只是

    function_name() {
    }
    
  • 方括号[ ]仅适用于特定类型的测试,例如判断字符串是否为空。你不需要它们来检查命令的退出状态。

  • 你的重定向语法是错的。

  • 在 shell 编程中,通常返回零状态表示成功,返回非零状态表示失败。因此,您应该交换返回值。

  • 引用任何变量时,您几乎总是应该使用双引号。否则,您的脚本将因意外输入(例如space参数中的字符)而中断(可能以危及安全的方式)。

答案3

function isInstalled {
    rpm -q $1 &> /dev/null;

    if [ $? == 0 ]; then
            return true;
    else
            return false;
    fi
}

测试:if [ isInstalled wget ]; then echo 'installed'; else echo 'not installed'; fi

相关内容