Я написал эту функцию:
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