Назад | Перейти на главную страницу

Как исправить функцию в 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

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
}

Ваша функция должна быть записана как

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

Ноты:

  • В более переносимый синтаксис для определения функции просто

    function_name() {
        …
    }
    
  • Квадратные скобки [ ] только для специфические виды тестов, например, пуста ли строка. Они не нужны вам для проверки статуса выхода команды.

  • Ваш синтаксис перенаправления неправильно.

  • В программировании оболочки принято возвращать нулевой статус в случае успеха и ненулевой статус в случае неудачи. Следовательно, вы должны поменять местами возвращаемые значения.

  • Вы почти всегда должны использовать двойные кавычки при ссылке на любую переменную. В противном случае ваши сценарии сломаются (возможно, нарушив безопасность) из-за неожиданного ввода (например, пространство символ в параметре).

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