Ich habe eine einfache Anforderung. Ich möchte mehrere Variablen definieren, die einer beliebigen Anzahl von Paketen entsprechen, die ich über ein Shell-Skript installieren möchte.
Beispielcode unten:
MISC="shutter pidgin"
WEB="apache2 mongodb"
for pkg in $MISC $WEB; do
if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
echo -e "$pkg is already installed"
else
apt-get -qq install $pkg
echo "Successfully installed $pkg"
fi
done
Alles funktioniert ein bisschen, aber die Logik scheint fehlerhaft zu sein, weil sie die gewünschten Pakete nicht zuverlässig installiert. Entweder heißt es, dass sie bereits installiert wurden, oder es wird versucht, Pakete zu installieren, die bereits zuvor installiert wurden.
Ich habe auch versucht mit command -v
oder die folgenden:
if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then
Und selbst mit den Flags -n
und kann -z
man prüfen, ob der zurückgegebene String leer war. Ich bin mir ziemlich sicher, dass mir hier ein guter Sinn fehlt.
Haben Sie eine Idee, was ich tun könnte, um sicherzustellen, dass ein Paket tatsächlich installiert ist oder nicht?
Vielen Dank!
apt-get install
installierte Pakete anfordern? Sie könnten einfach anrufenapt-get install $MISC $WEB
.Antworten:
Im Wesentlichen müssen Sie nur die
if
Bedingung durch ersetzenDie Verwendung ist nicht möglich
dpkg-query
, da sie auch für entfernte, aber nicht gelöschte Pakete true zurückgibt.Ich schlage auch vor, den Exit-Code von zu überprüfen,
apt-get
bevor die erfolgreiche Nachricht gesendet wird:quelle
&>
das?/dev/null
in diesem Fall), da wir nicht die Ausgabe, sondern nur den Exit-Code benötigen. Es funktioniert nur inbash
(die erste Zeile des Skripts muss sein#!/bin/bash
), ansonsten verwenden>/dev/null 2>&1
.Sie können es mit dpkg-query testen:
Beachten Sie, dass * und? sind Wildcards, wenn sie in $ pkg erscheinen. Ich vermute, dpkg-query gibt "reinst-required installed" anstelle von "ok installed" aus, wenn das Paket defekt ist und per Befehl neu installiert werden muss. Mit diesem Befehl
apt-get install --reinstall
können auch neue Pakete installiert werden.quelle
quelle