У меня есть простое требование. Я хочу определить несколько переменных, которые будут соответствовать любому количеству заданных пакетов, которые я хочу установить через скрипт оболочки.
Пример кода ниже:
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
флажками , чтобы проверить , если возвращаемая строка была пуста. Уверен, мне здесь не хватает здравого смысла.
Есть ли у вас какие-либо идеи, чтобы я мог убедиться, что пакет действительно установлен или нет?
Благодарность!
apt-get install
установленные пакеты? Вы могли бы просто позвонитьapt-get install $MISC $WEB
.Ответы:
По сути, вам нужно только заменить
if
условие наНевозможно использовать
dpkg-query
, потому что он возвращает true также для пакетов, удаленных, но не очищенных.Также я предлагаю проверить код выхода
apt-get
перед тем, как дать успешное сообщение:источник
&>
?/dev/null
в данном случае), потому что нам не нужен вывод, только код выхода. Это работает только вbash
(первая строка скрипта должна быть#!/bin/bash
), иначе используйте>/dev/null 2>&1
.Вы можете проверить это с помощью dpkg-query:
Обратите внимание, что * и? являются подстановочными знаками, если они появляются в $ pkg. Я предполагаю, что dpkg-query может вывести «reinst-required required» вместо «ok install», если пакет поврежден и требует переустановки командой,
apt-get install --reinstall
которая также может быть использована для установки новых пакетов.источник
источник