
Ich arbeite an einem Bash-Skript und bin auf ein Problem gestoßen. Ich wende an, was ich aus der Verwendung normaler if/fi-Anweisungen kenne, und versuche, damit Variablen festzulegen, die mit der Auswahl der Betriebssystemversion zusammenhängen, z. B. RH 7, Debian 7, Ubuntu usw. Das Problem ist, dass es einfach nicht so funktioniert, wie ich dachte. Ich führe jeden Teil manuell aus und es funktioniert einwandfrei, aber wenn ich alles in ein Skript einfüge, passiert nichts.
Gibt es eine bessere Möglichkeit, dies zu tun? Vielen Dank im Voraus
value1=$(cat /etc/redhat-release | awk '{ print $4 }' | cut -c 1)
value2=$(cat /etc/redhat-release | awk '{ print $3 }' | cut -c 1)
value3=$(lsb_release -sr)
value4=$(cat /etc/debian_version)
if [[ $value1 -eq 7 ]] && [[ -e /etc/redhat-release ]]; then
OS=RedHat
VER=RH7
elif [[ $value2 -eq 6 ]] && [[ -e /etc/redhat-release ]]; then
OS=RedHat
VER=RH6
elif [[ $value3 = 14.04 ]]; then
OS=Ubuntu
VER=UB1404
elif [[ -e /etc/debian_version ]] && [[ $value4 -eq 7 ]]; then
OS=Debian
VER=DEB7
fi
Antwort1
Ich denke, Ihr Problem könnten Probleme beim Vergleich von Gleitkommazahlen und Zeichenfolgen sein.
Soweit ich weiß, kann der Test nicht mit Gleitkommazahlen umgehen, daher $value3 = 14.04
gibt Ihr Test für ein Ergebnis zurück syntax error: invalid arithmetic operator (error token is ".04")
.
Sie könnten die Zahlen einfach als Zeichenfolge behandeln, wie folgt:
elif [[ "$value3" == "14.04" ]]; then
Beachten Sie auch die Anführungszeichen um $value3
, die ebenfalls erforderlich sind, um die 7.8
, die in meinem Fall von Debian 7.8 zurückgegeben wurden, als Zeichenfolge zu behandeln.
Wenn Sie nur die Hauptversionsnummer vergleichen möchten, können Sie auch den Teil nach dem Punkt entfernen:
value3=$(lsb_release -sr | cut -d. -f1)
Dadurch wird der von zurückgegebene String lsb_release -sr
an dem .
, den wir als Trennzeichen mit dem -d.
Parameter definiert haben, geteilt und dann die erste Spalte des Ergebnisses mit ausgewählt -f1
.
Dies funktioniert auch mit value4:
value4=$(cat /etc/debian_version | cut -d. -f1)
Dadurch wird die Ausgabe von my , die vor und nach dem Hinzufügen von /etc/debian_version
war, geschnitten .7.8
7
cut
Möglicherweise möchten Sie auch Warnungen für nicht vorhandene Dateien unterdrücken. Da ich kein Redhat-System zur Verfügung habe, habe ich die Fehlermeldungen der ersten beiden Befehle folgendermaßen umgeleitet /dev/null
:
value1=$(cat /etc/redhat-release 2> /dev/null | awk '{ print $4 }' | cut -c 1 )
Sagen Sie mir Bescheid, wenn Sie weitere Hilfe benötigen. Fügen Sie außerdem einige Ausgaben und vielleicht sogar erwartete Ausgaben Ihres Skripts hinzu, damit wir sehen können, wo Ihr Problem liegt.