У меня есть простое требование. Я хочу определить несколько переменных, которые будут соответствовать любому количеству заданных пакетов, которые я хочу установить с помощью сценария оболочки.
Пример кода ниже:
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
проверить, была ли возвращенная строка пустой. Уверен, мне здесь не хватает здравого смысла.
У вас есть идея, что я могу сделать, чтобы убедиться, что пакет действительно установлен или нет?
Спасибо!
#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
По сути, вам нужно только заменить условие 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
Вы можете проверить это с помощью 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
, которая также может быть использована для установки новых пакетов.