Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11634
Последний выпуск: 19.06.2015

BASH: проверить наличие пакета в системе (debian-like)

72K
19 ноября 2012 года
freetznightsoul
5 / / 28.02.2012
Может, я не туда пишу, если так - тыкните носом?

Простой скрипт на проверку наличия установленных пакетов в системе:


Код:
#!/bin/bash

for arg in nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev
do
    if [ -n "dpkg -l | grep $arg" ] #если строка не пуста,
        then
        echo $arg" installed!" #то пакет установлен,
        else
        echo $arg" NOT installed!" #коли пуста, то не установлен. Логично?
    fi
done
Не могу понять, почему строка ВСЕГДА не пустая (хотя если ввести dpkg -l | grep "имя" руками, на консоль ничего не выводится). Скрипт всегда говорит, что пакеты есть. У меня в скрипте первым прописан заведомо несуществующий пакет.

Вообще - как проверить наличие пакета в системе, не устанавливая ничего лишнего?
241
19 ноября 2012 года
arrjj
1.7K / / 26.01.2011
Вроде с кавычками трабла
Код:
#!/bin/bash

for arg in nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev
do
    if [ -n ""dpkg -l | grep $arg"" ] #если строка не пуста,
        then
        echo $arg" installed!" #то пакет установлен,
        else
        echo $arg" NOT installed!" #коли пуста, то не установлен. Логично?
    fi
done
72K
19 ноября 2012 года
freetznightsoul
5 / / 28.02.2012
Цитата: arrjj
Вроде с кавычками трабла



С Вашими кавычками:


Код:
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
nonexisting-package NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
autotools-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
bash NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
build-essential NOT installed!
grep: ]./install.sh: строка 7: [: пропущен `]'
: Нет такого файла или каталога
ddbus NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
desktop-file-utils NOT installed!
grep: ]./install.sh: строка 7: [: пропущен `]'
: Нет такого файла или каталога
libc6 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libcairo2 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libdbus-1-3 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libglib2.0-0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libgtk2.0-0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libgtk2.0-bin NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libpango1.0-0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libstartup-notification0 NOT installed!
grep: ]./install.sh: строка 7: [: пропущен `]'
: Нет такого файла или каталога
libx11-6 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
shared-mime-info NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
intltool NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
pkg-config NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libgtk2.0-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libglib2.0-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
fakeroot NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libstartup-notification0-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libdbus-1-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libudev0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libudev-dev NOT installed!
392
19 ноября 2012 года
grgdvo
322 / / 04.07.2007
используйте конструкцию $(dpkg ... ) или символы обратной кавычки `dpkg .... `
72K
22 августа 2013 года
freetznightsoul
5 / / 28.02.2012
все решилось. надо было просто двойные скобки поставить:
 
Код:
...
    if [[ -n ""dpkg -l | grep $arg"" ]] #если строка не пуста,
...
но все-таки это отстой. можно ввести "krusade", и конструкция скажет, что krusader есть.

кто-нибудь объяснит разницу между одинарными и двойными квадратными скобками?

надо найти какой-то другой способ определять статус пакета в системе
289
22 августа 2013 года
sadovoya
757 / / 19.11.2005
Цитата по источнику: "...При использовании двойных скобок ваши переменный не будут разбиты на несколько отдельных слов если вы использовали пробел, как пример, переменная VAR="var with space" будет единым целым".

Насчет статуса можно (?) на основе команды: dpkg --status пакет | grep "ok installed"
323
23 августа 2013 года
P*t*
474 / / 15.02.2007
grgdvo правильно написал.
Запись [ -n "dpkg -l | grep $arg" ] проверяет длину строки "dpkg -l | grep $arg", не выполняя эти команды.
Чтобы получить результаты выполнения надо писать [ -n `dpkg -l | grep $arg` ], либо [ -n $(dpkg -l | grep $arg) ]
Двойные скобки и кавычки здесь ни при чем.
289
23 августа 2013 года
sadovoya
757 / / 19.11.2005
Можно проверять код возврата. Короче, я бы примерно так написал:

Код:
#!/bin/bash

#Проверка установленных пакетов из списка
#-----------------------------------------
#
#Вариант с командой dpkg --status

lst="nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev"

for items in $lst
do
  cmd=$(dpkg --status $items 2>/dev/null | grep "ok installed")
  if [ $? == 0 ]
    then
      echo "$items installed (установлен)"
    else
      echo "$items NOT installed (не установлен)"
  fi
done

exit 0
А про квадратные двойные скобки -- см. "Искусство программирования на языке сценариев командной оболочки" Mendel Cooper. Есть еще и двойные круглые скобки. Из этого материала:

Начиная с версии 2.02, Bash предоставляет в распоряжение программиста конструкцию [[ ... ]] расширенный вариант команды test, которая выполняет сравнение способом более знакомым программистам, пишущим на других языках программирования. Обратите внимание: [[ -- это зарезервированное слово, а не команда.

Bash исполняет [[ $a -lt $b ]] как один элемент, который имеет код возврата.

Круглые скобки (( ... )) и предложение let ... так же возвращают код 0, если результатом арифметического выражения является ненулевое значение. Таким образом, арифметические выражения могут учавствовать в операциях сравнения.

Конструкция [[ ]] более универсальна, по сравнению с [ ]. Этот расширенный вариант команды test перекочевал в Bash из ksh88.

Внутри этой конструкции не производится никакой дополнительной интерпретации имен файлов и не производится разбиение аргументов на отдельные слова, но допускается подстановка параметров и команд.

Конструкция [[ ... ]] более предпочтительна, нежели [ ... ], поскольку поможет избежать некоторых логических ошибок. Например, операторы &&, ||, < и > внутри [[ ]] вполне допустимы, в то время как внутри [ ] порождают сообщения об ошибках.

Внутри (( )) производится вычисление арифметического выражения. Если результатом вычислений является ноль, то возвращается 1, или "ложь". Ненулевой результат дает код возврата 0, или "истина". То есть полная противоположность инструкциям test и [ ]
289
23 августа 2013 года
sadovoya
757 / / 19.11.2005
Лучше так:

Код:
#!/bin/bash

#Проверка установленных пакетов из списка
#-----------------------------------------
#
#Вариант с командой dpkg -l

lst="nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev"

dpkg -l 2>/dev/null > ls.tmp

for items in $lst
do
  cmd=$(grep "\ $items\ " ls.tmp)
  if [ $? == 0 ]
    then
      echo "$items installed (установлен)"
    else
      echo "$items NOT installed (не установлен)"
  fi
done

rm ls.tmp

exit 0

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог