Skript, um zu überprüfen, ob bereits ein Programm installiert ist

11

Wie kann ich ein Bash-Skript erstellen, das überprüft, ob ein Programm bereits installiert ist, und wenn nicht, installiert es es?

Danke für Ihre Hilfe.

Hier ist der Code, den ich bisher habe:

#/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
quelle
10
Beabsichtigen Sie zu überschreiben /usr/bin?
D. Ben Knoble
1
Unterscheiden Sie zwischen Paketnamen und ausführbaren Dateinamen? Oder möchten Sie beide überprüfen? Nur Georges Antwort
sucht
Warum willst du das überprüfen? Wozu dient dieses Skript?
Braiam
@Braiam Zumindest mit apt ändert die Installation eines bereits installierten Pakets seinen Status von automatisch zu manuell, wenn es nur als Abhängigkeit von einem anderen Paket installiert wurde. Wenn dieses andere Paket später entfernt wird, wird dieses Paket nicht mehr zum automatischen Entfernen markiert. Ich habe ein Skript zum Installieren einer bearbeiteten Liste von Paketen aus einer vorherigen Installation in einer neuen. Diese Technik verhindert, dass das neue System durcheinander gebracht wird.
Joe
@ Joe, das ist eine schlechte Lösung. Sie sollten stattdessen nur die Liste der installierten Pakete abrufen und apt-mark showmanualdann mit so etwas installieren apt-get install "$(< package.list)".
Braiam

Antworten:

11

du kannst das:

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

Überprüfen Sie dann den Exit-Status. Nur wenn der Exit-Status des obigen Befehls gleich 0dem installierten Paket war .

damit:

   #!/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
quelle
Außer es nicht? Was ist mit der Leitung passiert sudo apt install $name? Der Befehl muss in die nächste Zeile gehen ... Ansonsten gute Arbeit ...
Zanna
3
Beachten Sie, dass Software auf verschiedene Arten installiert werden kann und dpkgnur für installierte Debian-Pakete relevant ist. Im speziellen Fall von OP youtube-dlkönnte zum Beispiel auch über Pythons Paketmanagerpip
Sergiy Kolodyazhnyy
2
Warum nicht if dpkg -s “$name” &> /dev/null ; then? Gleicher Effekt, sauberer / klarer imo.
D. Ben Knoble
In der Tat ist die Überprüfung des Ausgangsstatus genau das, was iftut ...
Zanna
4

Hier ist eine Funktion, die ich für den Zweck geschrieben habe, den ich in meinen Skripten verwende. Es prüft, ob das erforderliche Paket installiert ist, und fordert den Benutzer auf, es zu installieren, wenn dies nicht der Fall ist. Es erfordert einen Paketnamen als Parameter. Wenn Sie den Namen des Pakets nicht kennen, zu dem ein erforderliches Programm gehört, können Sie es nachschlagen. Informationen dazu finden Sie hier.

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
quelle
3

Diese Befehlszeile überprüft das whichProgramm und kehrt zurück, 0wenn es installiert ist und 1wenn nicht:

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

Natürlich werden Sie es in Ihrem Skript folgendermaßen verwenden:

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

Eine einfache Verwendung wäre:

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

Beachten Sie mehrere Dinge:

  1. Sie müssen sich bei der Installation mit Abhängigkeitsproblemen befassen
  2. Um eine Interaktion mit dem Skript während der Installation zu vermeiden, finden Sie hier Beispiele.
  3. Sie können die Rückgabewerte dieser Funktion abrufen und damit entscheiden, ob sie installiert werden sollen oder nicht.
George Udosen
quelle
whichist super nicht tragbar. Ich benutze command -vstattdessen häufig , aber es hängt stark von der Art des Namens ab, den Sie suchen (Alias, Funktion, ausführbare Datei
usw.
Super nicht portabel für eine Frage, die für eine Ubuntu-Maschine ist? Dies ist keine Unix & LinuxSeite! Wenn ich es vor Unix & LinuxOrt beantworten würde, wäre das eine andere Sache!
George Udosen
3

Warum möchten Sie es überhaupt überprüfen? Wenn Sie keinen guten Grund dafür haben, tun Sie es nicht, nur apt-get install packagevorbei. Wenn es bereits installiert ist, wird es aktualisiert, wenn eine neuere Version verfügbar ist. Wenn es installiert ist und auf dem neuesten Stand ist, passiert nichts. Für den Fall, dass eine Konfiguration angewendet werden muss, gibt es andere Optionen, z. B. das Erstellen eines Konfigurationspakets, das vom Paket abhängt, oder die Verwendung einer Konfigurationsverwaltungssoftware wie ansible.

user2567875
quelle
1
Oft passiert etwas: Zumindest bei apt ändert die Installation eines bereits installierten Pakets seinen Status von automatisch zu manuell, wenn es nur als Abhängigkeit von einem anderen Paket installiert wurde. Wenn dieses andere Paket später entfernt wird, wird dieses Paket nicht mehr zum automatischen Entfernen markiert. Ich habe ein Skript zum Installieren einer bearbeiteten Liste von Paketen aus einer vorherigen Installation in einer neuen. Diese Technik verhindert, dass das neue System durcheinander gebracht wird.
Joe
2

Eine einfache Möglichkeit, nach installierten Paketen zu suchen, indem Sie apt-mark:

apt-mark showinstalllistet alle Pakete auf, die als installiert markiert sind (bereits installiert oder zur Installation in die Warteschlange gestellt). Danach müssen Sie nur noch die Pakete durchsuchen, die Ihnen wichtig sind.

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

user535733
quelle
Du bist auf dem richtigen Weg! Ändern Sie es einfach in dieses, um die Fehlalarme zu beseitigen: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "installiert" || Echo "nicht"
Eric Mintz
@EricMintz - danke für die Verbesserung! Bearbeitet.
user535733