Script pour vérifier si un programme est déjà installé

11

Comment puis-je créer un script bash qui vérifie si un programme est déjà installé et, s'il ne l'est pas, l'installe?

Merci de votre aide.

Voici le code que j'ai jusqu'à présent:

#/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
GUILLEM NAVALON BABIA
la source
10
Avez-vous l'intention d'écraser /usr/bin?
D. Ben Knoble
1
Faites-vous la différence entre les noms de packages et les noms de fichiers exécutables? Ou voulez-vous vérifier les deux? Seule la réponse de George vérifie actuellement les exécutables
Xen2050
Pourquoi voulez-vous le vérifier? Quelle est l'utilisation prévue de ce script?
Braiam
@Braiam Au moins avec apt, l'installation d'un package déjà installé changera son statut de automatique à manuel s'il n'a été installé qu'en tant que dépendance d'un autre package. Si cet autre package est supprimé ultérieurement, ce package ne sera plus marqué pour la suppression automatique. J'ai un script pour installer une liste éditée de packages d'une installation précédente dans une nouvelle. Cette technique l'empêche de gâcher le nouveau système.
Joe
@Joe qui est une mauvaise solution. Au lieu de cela, vous devriez simplement obtenir la liste des packages installés avec apt-mark showmanualpuis l'installation avec quelque chose comme apt-get install "$(< package.list)".
Braiam

Réponses:

11

tu peux le faire:

dpkg -s <packagename> &> /dev/null

puis vérifiez l'état de sortie. uniquement si l'état de sortie de la commande ci-dessus était égal au 0package installé .

donc:

   #!/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
Hossein
la source
Sauf que non? Qu'est-il arrivé à la ligne sudo apt install $name? La commande doit aller sur la ligne suivante ... Sinon, beau travail ...
Zanna
3
Notez que le logiciel peut être installé de différentes manières et dpkgn'est pertinent que pour les paquets Debian installés. Dans le cas particulier d'OP, youtube-dlpar exemple, pourrait également être installé via le gestionnaire de paquets de pythonpip
Sergiy Kolodyazhnyy
2
Pourquoi pas if dpkg -s “$name” &> /dev/null ; then? Même effet, imo plus propre / plus clair.
D. Ben Knoble
en effet, vérifier le statut de sortie est exactement ce que iffait ...
Zanna
4

Voici une fonction que j'ai écrite dans le but que j'utilise dans mes scripts. Il vérifie si le package requis est installé et sinon, invite l'utilisateur à l'installer. Il nécessite un nom de package comme paramètre. Si vous ne connaissez pas le nom du package auquel appartient un programme requis, vous pouvez le rechercher. Informations à ce sujet disponibles ici.

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
}
Elder Geek
la source
3

Cette ligne de commande vérifiera à l'aide du whichprogramme et retournera 0si elle est installée et 1sinon:

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

Bien sûr, vous l'utiliserez de cette manière dans votre script:

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

Une utilisation simple serait:

#!/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

Notez plusieurs choses:

  1. Vous devrez gérer les problèmes de dépendance lors de l'installation
  2. Pour éviter l'interaction avec le script pendant l'installation, voir ici des exemples.
  3. Vous pouvez attraper les valeurs de retour de cette fonction et l'utiliser pour décider d'installer ou non.
George Udosen
la source
whichest super non portable. J'utilise souvent à la command -vplace, mais cela dépend fortement du type de nom que vous recherchez (alias, fonction, exécutable, etc.)
D. Ben Knoble
Super non portable pour une question qui concerne une machine Ubuntu? Ce n'est pas un Unix & Linuxsite! Si je répondais sur Unix & Linuxplace, ce serait différent!
George Udosen
3

Pourquoi voulez-vous le vérifier en premier lieu? Sauf si vous avez une bonne raison à cela, ne le faites pas, juste apt-get install packageaprès. S'il est déjà installé, il sera mis à jour s'il existe une version plus récente, s'il est installé et à jour, rien ne se passera. Si vous avez une configuration à appliquer, il existe d'autres options, comme la création d'un package de configuration qui dépend du package ou l'utilisation d'un logiciel de gestion de configuration comme ansible.

user2567875
la source
1
Quelque chose se produira souvent: au moins avec apt, l'installation d'un package déjà installé fera passer son statut d'automatique à manuel s'il n'était installé qu'en tant que dépendance d'un autre package. Si cet autre package est supprimé ultérieurement, ce package ne sera plus marqué pour la suppression automatique. J'ai un script pour installer une liste éditée de packages d'une installation précédente dans une nouvelle. Cette technique l'empêche de gâcher le nouveau système.
Joe
2

Une façon simple de vérifier les packages installés en utilisant apt-mark:

apt-mark showinstallrépertorie tous les packages marqués comme étant installés (déjà installés ou en attente d'installation). Après cela, il suffit de saluer le ou les paquets qui vous intéressent.

Exemple: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"

user535733
la source
Vous êtes sur la bonne voie! Modifiez-le simplement pour éliminer les faux positifs: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "installé" || écho "pas"
Eric Mintz
@EricMintz - merci pour l'amélioration! Édité.
user535733