Folgendes verwende ich derzeit zum Testen der Debian-Version. Statt dies zu tun Kann ich es auf diese Weise prägnanter gestalten?
#!/bin/bash VERSION=NONE if [ $(cat /etc/debian_version) == "7.3" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.2" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.1" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.0" ]; then VERSION=7 fi
Ich weiß, dass dies nicht die attraktivste Methode ist. Ich möchte verstehen, wie die Datei unter /etc/debian_version
verwendet wird, um die Versionsnummer vor der .
zu lesen und die Nummer danach zu ignorieren.
Ich habe versucht,
if [ $(cat /etc/debian_version) == "7.*" ]; then
zu verwenden, und ich habe auch versucht,
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
Aber beides hat bei mir nicht funktioniert. Ich möchte mein Skript zukunftssicher machen, damit ich, wenn Debian 7.4 veröffentlicht wird, nicht alle darauf basierenden Skripte erneut durchgehen und sie ändern muss.
Mir ist auch das lsb_release -a
zeigt mir die relativen Informationen, ich weiß nur nicht, wie ich das, was ich will, „ausschneiden“ und überprüfen kann, ob es Debian 6 oder 7 ist. Das ursprüngliche Skript, wie Sie sich vorstellen können , ist ziemlich langwierig.
Alle anderen Beiträge, auf die Sie mich verweisen können, wären auch dankbar, wenn Sie die Methode zum „Ausschneiden“ der Antwort verwenden, um nur den gewünschten Teil herauszuschneiden.
Antwort
Es gibt viele Möglichkeiten, das zu tun, was Sie wollen. Dieser entfernt nur den Dezimalpunkt und alles danach aus der Versionsnummer:
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
bedeutet einen Punkt ( \.
) gefolgt von null oder mehr Zeichen (.*
). Für sed
bedeutet der Ausdruck s/\..*//
also, die Periode und alles, was folgt, durch nichts zu ersetzen. Das Ergebnis des Befehls sed
wird in der Umgebungsvariablen VERSION
gespeichert.
if / then / elif /…/ fi Anweisungen. Es funktioniert sowohl mit bash als auch mit normalem / bin / sh.
MEHR: sed
ist ein Stream-Editor: Das heißt, er liest Zeilen aus stdin, bearbeitet sie gemäß den Anweisungen und sendet sie (normalerweise) an stdout. In diesem Fall geben wir ihm eine „Ersatz“ -Anweisung. Zum Beispiel bedeutet s/foo/bar/
, das erste Vorkommen von foo zu finden und durch bar zu ersetzen. Als Sonderfall bedeutet s/foo//
, foo
durch nichts zu ersetzen. In unserem Fall möchten wir einen Punkt, gefolgt von einem Zeichen, durch nichts ersetzen. Jetzt ist ein Punkt „.“ mit der Ausnahme, dass sed
normalerweise einen Punkt als „beliebiges Zeichen“ behandelt. Wir müssen ihm also „entkommen“, indem wir ihm einen Backslash voranstellen. Wenn sed
\.
sieht, weiß es, dass wir eine wörtliche Periode meinen. Wir möchten auch alle Zeichen löschen, die dem Punkt folgen. Um „ein beliebiges Zeichen“ darzustellen, verwenden wir einen Punkt .
(kein Escape). Um allgemein zu sein, möchten wir jedoch alle Zeichen nach dem Punkt löschen, unabhängig davon, wie viele es gibt. Während also in der Sprache von sed
„ein Punkt ein beliebiges Zeichen bedeutet, bedeutet der Stern“ eine beliebige Zahl des vorhergehenden Zeichens „(die Null sein könnte). Somit ist ein Periodenstern .*
bedeutet null oder mehr Zeichen. Wenn Sie also alles zusammenfügen, teilt s/\..*//
sed
mit Wenn es einen Punkt findet, auf den möglicherweise etwas folgt, ersetzen Sie ihn durch nichts.
Kommentare
- Kann diese Antwort für mich ausgearbeitet werden Verstehen Sie, was der Teil
s/
bedeutet, aber was ist mit\..*
? - @DanijelJ Ich habe eine Erklärung hinzugefügt Überschneiden Sie sich mit dem, was Sie bereits wissen, aber ich dachte, das wäre besser, als etwas wegzulassen, das Sie nicht getan haben. ' t. Lassen Sie mich wissen, ob es hilft.
- Ja, Das erklärt mir sehr viel. Ich habe die zweite
\.
verstanden. ' konnte die zweite . Vielen Dank, dass Sie dies für mich geklärt haben.
Antwort
Hier ist eine Lösung, die bash verwendet, keine externen Dienstprogramme und ist ein einzelner Aufruf
read -d . VERSION < /etc/debian_version
Dies lautet /etc/debian_version
und teilt die Eingabe auf die Periode auf (.
), weist VERSION
alles vor dem Punkt zu und verwirft alles danach.
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
Dies ist insofern etwas anders, als alles nach dem Punkt in VERSION_MINOR gespeichert wird.
IFS="." read -a VERSION < /etc/debian_version
Dieser ist der mächtigste in diesem Bereich Es wird nach Periode aufgeteilt und dem Array $VERSION
zugewiesen. Wenn die Version 1.2.3
lautet, dann ${VERSION[0]} == 1
${VERSION[1]} == 2
und ${VERSION[2]} == 3
.
Kommentare
- Das ist ausgezeichnet!Ich ' habe noch nie gesehen, dass das Lesen so verwendet wird!
Antwort
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
Dies kann natürlich erweitert werden, um weitere Versionen zu erkennen.