Script to check if some program is already installed
Solution 1
you can do this:
dpkg -s <packagename> &> /dev/null
then check exit status.only if the exit status of the above command was equal to 0
then the package installed.
so:
#!/bin/bash
echo "enter your package name"
read name
dpkg -s $name &> /dev/null
if [ $? -ne 0 ]
then
echo "not installed"
sudo apt-get update
sudo apt-get install $name
else
echo "installed"
fi
Solution 2
Here's a function I wrote for the purpose that I use in my scripts. It checks to see if the required package is installed and if not, prompts the user to install it. It requires a package name as a parameter. If you don't know the name of the package a required program belongs to you can look it up. Information on that available here.
function getreq {
dpkg-query --show "$1"
if [ "$?" = "0" ];
then
echo "$1" found
else
echo "$1" not found. Please approve installation.
sudo apt-get install "$1"
if [ "$?" = "0" ];
then echo "$1" installed successfully.
fi
fi
}
Solution 3
This line of command will check using the which
program and will return 0
if installed and 1
if not:
which apache | grep -o apache > /dev/null && echo 0 || echo 1
Of course you will use it in this manner in your script:
which "$1" | grep -o "$1" > /dev/null && echo "Installed!" || echo "Not Installed!"
A simple usage would be:
#!/usr/bin/env bash
set -e
function checker() {
which "$1" | grep -o "$1" > /dev/null && return 0 || return 1
}
if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi
Note several things:
- You will have to deal with dependenciy issues while installing
- To avoid interaaction with script during install see here for examples.
- You can catch the return values from that function an use it to decide whether to install or not.
Solution 4
Why do you want to check it in the first place? Unless you have a good reason for it, don't do it, just apt-get install package
over. If it's already installed it will be updated if there is a newer version available, if it is installed and it is up to date, nothing will happen. In case you have some configuration that needs to be applied, there are other options, like building an configuration package which depends on the package or using configuration management software like ansible.
Solution 5
One easy way to check for installed packages using apt-mark
:
apt-mark showinstall
will list all packages marked install (already installed, or queued for installation). After that, it's a simple matter of grepping the package(s) you care about.
Example: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"
Related videos on Youtube
![Guillem Navalon Babià](https://lh3.googleusercontent.com/-LZzE9pWBQgM/AAAAAAAAAAI/AAAAAAAAACA/fGgw5e48Gso/photo.jpg?sz=256)
Guillem Navalon Babià
Updated on September 18, 2022Comments
-
Guillem Navalon Babià almost 2 years
How can I create a bash script that checks if a program is already installed, and if it isn't, installs it?
Thanks for your help.
Here's the code I have so far:
#/bin/bash PS3="choose an option" select opcion in "Installing_Youtube" "exit" do case $opcion in "Installing_Youtube") youtube-dl > /usr/bin if [ $? -eq 127 ] ; then echo "installing youtube" apt-get update apt-get install youtube-dl mkdir Videos else echo "Youtube already installed" fi ;; "exit") exit
-
Eric Mintz over 5 yearsYou're on the right track! Just change it to this to eliminate the false positives: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"
-
Zanna over 5 yearsExcept it doesn't? What happened to the line with
sudo apt install $name
? The command needs to go on the next line... Otherwise, nice work... -
Sergiy Kolodyazhnyy over 5 yearsNote that software could be installed in a variety of ways, and
dpkg
is only relevant for installed debian packages. In OP's particular case,youtube-dl
for instance could be also installed via python's package managerpip
-
D. Ben Knoble over 5 yearsWhy not
if dpkg -s “$name” &> /dev/null ; then
? Same effect, cleaner/clearer imo. -
D. Ben Knoble over 5 years
which
is super non-portable. I frequently usecommand -v
instead, but it depends heavily on the type of name you’re looking for (alias, function, executable, &c.) -
user535733 over 5 years@EricMintz - thanks for the improvement! Edited.
-
Zanna over 5 yearsindeed, checking the exit status is exactly what
if
does... -
George Udosen over 5 yearsSuper non-portable for a question that is for an Ubuntu machine? This is isn't
Unix & Linux
site! If i were answering it onUnix & Linux
site that would be a different matter! -
Joe over 5 yearsSomething will often happen: At least with apt, installing an already installed package will change its status from automatic to manual if it was only installed as a dependency of another package. If that other package is later removed, this package will no longer be marked for auto removal. I have a script to install an edited list of packages from a previous install into a new one. This technique keeps it from making a mess of the new system.
-
Max over 2 yearsThis is an irrelevant answer. It is like asking why do you want to add 5 Dollar for apple juice and 6 dollars for bread, just give the guy a 20 and he will give you back the right amount.