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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.