Bash Скрипт - Как проверить, установлен ли пакет, и выполнить действие на основе результатов терминала - PullRequest
0 голосов
/ 03 февраля 2020

В настоящее время я работаю над проектом, в котором мне нужно обновить несколько систем, которые не подключены к inte rnet. Каждый пакет rpm, который мне нужно вручную загружать и устанавливать / обновлять в каждой системе.

Я пытаюсь создать скрипт, который будет проверять, установлена ​​ли более старая версия пакета и будет ли она выполняться обновление. В противном случае перейдите к следующему пакету (я только обновляю пакет, а не устанавливаю новые.)

Вот то, что у меня есть в настоящее время. Скрипт ссылается на файл со списком всех пакетов. У меня нет имени пакета для каждого пакета, но у меня есть rpms, поэтому мне любопытно, как я могу сделать правильное сравнение в операторе if, чтобы скрипт выполнял другое действие, если оно истинно.

Рабочий раствор:

IFS="="
while read -r name value
do

if [[ $(rpm -qi ${name//\"/}) == "package ${name//\"/} is not installed" ]] 
    then
    echo "Package ${name//\"/} is not installed, moving on..." 
else    
    if [[ "${value//\"/}" == *"kernel"* ]]
        then
        rpm -ivh ${value//\"/}
    else 
        rpm -Uvh ${value//\"/}
    fi
fi

echo 'Done!'
done < patches.conf >> patching_log.conf

Заранее спасибо!

Ввод:

RHSA-2019:3979(kernel-tools-debuginfo)=kernel-tools-debuginfo-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(kernel-tools-libs)=kernel-tools-libs-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(perf)=perf-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(perf-debuginfo)=perf-debuginfo-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(python-perf)=python-perf-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(python-perf-debuginfo)=python-perf-debuginfo-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:4024(SDL-32)=SDL-1.2.15-15.el7_7.i686.rpm
RHSA-2019:4024(SDL-64)=SDL-1.2.15-15.el7_7.x86_64.rpm

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Если у вас есть шанс, пожалуйста, покажите нам пример вашего ввода.
Я посмотрел вашу программу и предоставляю переписать:

IFS="="
while read -r patchName patchrpm
do
  RPM=${patchrpm//\"/}
  if 
    ! rpm -qi $RPM
  then
    echo "Package $RPM is not installed, moving on to next package." 
  else 
      rpm -Uvh $RPM
  fi
done < patches.conf >> patching_log.conf

Вот та же самая программа снова с номерами строк на случай, если вам нужно задать конкретные c вопросы:

 1  IFS="="
 2  while read -r patchName patchrpm
 3  do
 4    RPM=${patchnum//\"/}
 5    if 
 6      ! rpm -qi $RPM
 7    then
 8      echo "Package $RPM is not installed, moving on to next package." 
 9    else 
10        rpm -Uvh $RPM
11    fi
12  done < patches.conf >> patching_log.conf
0 голосов
/ 04 февраля 2020

Вместо добавления большого количества логи c почему бы не прочитать руководство по rpm и использовать команду:

rpm -F package_name

Это обновит его, если оно установлено, и продолжит работу, если нет.

Для ядра вам нужно установить, а не обновлять, поэтому часть лога c должна оставаться там

...