Determine if .deb package is installed using Bash I was able to use dpkg-query to determine if a package is installed on Ubuntu, but it's a bit of a mess because the name used to install the package doesn't always align with what it's installed as. For instance, gnutls-dev is installed under libgnutls-dev...

Any suggestions on how I could clean this up a bit?

function isInstalled() {
    if dpkg-query -W -f'${Status}' "$1" 2&gt;/dev/null | grep -q "ok installed" || dpkg-query -W -f'${Status}' "lib$1" 2&gt;/dev/null | grep -q "ok installed"; then
        echo 1;
    fi

    echo 0
}
It seems odd that the function prints 0 in all cases, including when 1 has been printed.

For a utility like this, it's probably better to communicate via the exit status:

isInstalled() {
    !   dpkg-query -W -f'${Status}' "$1" 2&gt;/dev/null | grep -q "ok installed" \
     || dpkg-query -W -f'${Status}' "lib$1" 2&gt;/dev/null | grep -q "ok installed"
}


I'd be inclined to remove the !, returning zero (success) if the package is found.

If you have aptitude available, it's possible to ask it to search for any installed package of the given name, or providing the name:

aptitude -q2 search "~i~P?exact-name($1)|~i?exact-name($1)" &gt;/dev/null



~i: installed package
~P: provides name
|: alternation
^$1\$
?exact-name: exactly what it says


This is less brittle, as it doesn't rely on the providing package being formed by prepending lib to the virtual package name.  For example, with www-browser, it finds all installed web browsers.  Also, it avoids matching superstrings of the supplied name.

If you know that $1 will always be the name of a virtual package, you can of course use just the ~P side of the alternation.