24

I need to check for installed packages and if not installed install them.

Example for RHEL, CentOS, Fedora:

rpm -qa | grep glibc-static
glibc-static-2.12-1.80.el6_3.5.i686

How do I do a check in BASH?

Do I do something like?

if [ "$(rpm -qa | grep glibc-static)" != "" ] ; then

And what do I need to use for other distributions? apt-get?

amanada.williams
  • 467
  • 2
  • 4
  • 9

4 Answers4

52

Try the following code :

if ! rpm -qa | grep -qw glibc-static; then
    yum install glibc-static
fi

or shorter :

rpm -qa | grep -qw glibc-static || yum install glibc-static

For debian likes :

dpkg -l | grep -qw package || apt-get install package

For archlinux :

pacman -Qq | grep -qw package || pacman -S package
Gilles Quénot
  • 173,512
  • 41
  • 224
  • 223
  • Silent + only whole words, not just part of words – Gilles Quénot Mar 31 '15 at 15:42
  • 2
    Hi all, I was using this code in something else and found that this does not differentiate partial matches. in my case (RedHat) I had a package `file-libs` installed but not `file` which was what I wanted; when I put `rpm -qa | grep -qw file || yum install -y file`, then `file` didn't install. The best solution is not to use `grep` at all. Just use something like this: `rpm --quiet --query file || yum install -y file` – Adam Burley Dec 06 '17 at 15:33
1

Based on @GillesQuenot and @Kidbulra answers, here's an example how to loop over multiple packages, and install if missing:

packageList="git gcc python-devel"

for packageName in $packageList; do
  rpm --quiet --query $packageName || sudo yum install -y $packageName
done
Noam Manos
  • 15,216
  • 3
  • 86
  • 85
0
if [ $(yum list installed | cut -f1 -d" " | grep --extended '^full name of package being checked$' | wc -l) -eq 1 ]; then
  echo "installed";
else
  echo "missing"
fi

I use this because it returns installed / missing without relying on an error state (which can cause problems in scripts taking a "no tolerance" approach to errors via

set -o errexit

for example)

Pancho
  • 2,043
  • 24
  • 39
0

If you are doing this against downloaded RPMs. you can do it by.

rpm -Uvh package-name-version-tag.rpm
diyoda_
  • 5,274
  • 8
  • 57
  • 89