Надежно проверьте, установлен ли пакет или нет

У меня есть простое требование. Я хочу определить несколько переменных, которые будут соответствовать любому количеству заданных пакетов, которые я хочу установить с помощью сценария оболочки.

Пример кода ниже:

MISC="shutter pidgin"
WEB="apache2 mongodb"

for pkg in $MISC $WEB; do
    if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
        echo -e "$pkg is already installed"
    else
        apt-get -qq install $pkg
        echo "Successfully installed $pkg"
    fi
done

Все вроде работает, но логика кажется ошибочной, потому что она не надежно устанавливает нужные мне пакеты. Он либо говорит, что они уже установлены, либо пытается установить пакеты, которые уже были установлены ранее.

Я также пытался использовать command -v или следующее:

if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then

И даже с флагами -n и -z проверить, была ли возвращенная строка пустой. Уверен, мне здесь не хватает здравого смысла.

У вас есть идея, что я могу сделать, чтобы убедиться, что пакет действительно установлен или нет?

Спасибо!

20
задан 12 July 2013 в 18:43

3 ответа

#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
0
ответ дан 12 July 2013 в 18:43

По сути, вам нужно только заменить условие if на

if dpkg --get-selections | grep -q "^$pkg[[:space:]]*install$" >/dev/null; then

Невозможно использовать dpkg-query, потому что оно возвращает true также для пакетов, удаленных, но не очищенных.

Также я предлагаю проверить код выхода apt-get, прежде чем выдать успешное сообщение:

if apt-get -qq install $pkg; then
    echo "Successfully installed $pkg"
else
    echo "Error installing $pkg"
fi
0
ответ дан 12 July 2013 в 18:43

Вы можете проверить это с помощью dpkg-query:

if dpkg-query -W -f'${Status}' "$pkg" 2>/dev/null | grep -q "ok installed"; then

Обратите внимание, что * и? являются подстановочными знаками, если они появляются в $ pkg. Я предполагаю, что dpkg-query может вывести «reinst-required required» вместо «ok install», если пакет поврежден и его необходимо переустановить командой apt-get install --reinstall, которая также может быть использована для установки новых пакетов.

0
ответ дан 12 July 2013 в 18:43

Другие вопросы по тегам:

Похожие вопросы: