Bash scripting: check for and install missing dependencies
Commenta martedì 3 gennaio 2012, ore 16:49
Sometimes we need some dependencies are installed on the operating system to run a bash script. So you can create a script that installs the missing dependencies.
After making a list of required dependencies, there are two ways to do this:
- pass the entire list to the package manager. Then the package manager will check which packages are already installed and will proceed with the installation of those that are missing;
- check what dependencies are already installed, make a list of dependencies that are missing, then pass to the package manager only missing dependencies list.
The second choice is the best choice, besides being more elegant. First, because it has a better chance of success (by hypothesis, some package managers may not work, if we ask it to install a package that’s already installed); second, ’cause if we were having some problems with the installation (for whatever reason), we can say exactly to the user what are the packages that he has to install manually.
Now let’s see what we have to do. As I have already said, we should:
- make a list of required dependencies (it’ll be the DEPENDENCIES array);
- check what dependencies are missing and save them in a new list (it’ll be the PKGSTOINSTALL string);
- install missing dependencies (from the PKGSTOINSTALL string).
Well, let’s go to the code. We need to create a list of required dependencies, for example foo and bar packages:
DEPENDENCIES=(foo bar)
Now we need to check which of those packages are already installed. The missing packages will be added to the PKGSTOINSTALL string, separated by a space:
# What dependencies are missing?
PKGSTOINSTALL=""
for (( i=0; i /dev/null; then
if [[ ! `dpkg -l | grep -w "ii ${DEPENDENCIES[$i]} "` ]]; then
PKGSTOINSTALL=$PKGSTOINSTALL" "${DEPENDENCIES[$i]}
fi
# OpenSuse, Mandriva, Fedora, CentOs, ecc. (with rpm)
elif which rpm &> /dev/null; then
if [[ ! `rpm -q ${DEPENDENCIES[$i]}` ]]; then
PKGSTOINSTALL=$PKGSTOINSTALL" "${DEPENDENCIES[$i]}
fi
# ArchLinux (with pacman)
elif which pacman &> /dev/null; then
if [[ ! `pacman -Qqe | grep "${DEPENDENCIES[$i]}"` ]]; then
PKGSTOINSTALL=$PKGSTOINSTALL" "${DEPENDENCIES[$i]}
fi
# If it's impossible to determine if there are missing dependencies, mark all as missing
else
PKGSTOINSTALL=$PKGSTOINSTALL" "${DEPENDENCIES[$i]}
fi
done
With a loop we will be checked every necessary dependency. Dpkg will be used for the deb-based distros (Debian, Ubuntu and derivatives, as Mint), rpm for the rpm-based (OpenSuse, Mandriva, Fedora, CentOs, etc.) and pacman for ArchLinux. If none of these is available on the system (for whatever reason), all the required dependencies will be marked as missing.
At this point, as I said before, the PKGSTOINSTALL string contains the list of required dependencies that are missing. We can proceed to install them:
# If some dependencies are missing, asks if user wants to install
if [ "$PKGSTOINSTALL" != "" ]; then
echo -n "Some dependencies are missing. Want to install them? (Y/n): "
read SURE
# If user want to install missing dependencies
if [[ $SURE = "Y" || $SURE = "y" || $SURE = "" ]]; then
# Debian, Ubuntu and derivatives (with apt-get)
if which apt-get &> /dev/null; then
apt-get install $PKGSTOINSTALL
# OpenSuse (with zypper)
elif which zypper &> /dev/null; then
zypper in $PKGSTOINSTALL
# Mandriva (with urpmi)
elif which urpmi &> /dev/null; then
urpmi $PKGSTOINSTALL
# Fedora and CentOS (with yum)
elif which yum &> /dev/null; then
yum install $PKGSTOINSTALL
# ArchLinux (with pacman)
elif which pacman &> /dev/null; then
pacman -Sy $PKGSTOINSTALL
# Else, if no package manager has been founded
else
# Set $NOPKGMANAGER
NOPKGMANAGER=TRUE
echo "ERROR: impossible to found a package manager in your sistem. Please, install manually ${DEPENDENCIES[*]}."
fi
# Check if installation is successful
if [[ $? -eq 0 && ! -z $NOPKGMANAGER ]] ; then
echo "All dependencies are satisfied."
# Else, if installation isn't successful
else
echo "ERROR: impossible to install some missing dependencies. Please, install manually ${DEPENDENCIES[*]}."
fi
# Else, if user don't want to install missing dependencies
else
echo "WARNING: Some dependencies may be missing. So, please, install manually ${DEPENDENCIES[*]}."
fi
fi
Now I’ll explain this portion of code. First of all, the script asks the user if he wanna proceed with the installation (else, it will tell the user which packages have to install manually). Then it proceeds by using the package manager avaible on the system: apt-get for Debian, Ubuntu and derivateves, zypper for OpenSuse, urpmi for Mandriva, yum for Fedora and CentOS and pacman for Archlinux.
If none is available, the user indicates which packages have to install manually. Finally it verifies if the installation was successful and in case of problems, again, alerts the user.
Good luck.
(in italiano: Bash scripting: verificare e installare dipendenze mancanti)











