GNU/Linux >> LINUX-Kenntnisse >  >> Linux

wenn mit Regex im Bash-Code

Viel einfacher, den Release-String direkt zu prüfen

if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...

Der grep Befehl passt nach regulärem Ausdruck. Die [56] Atom stimmt mit 5 überein oder 6 , sodass das Muster auf 7.5 passt oder 7.6 . Seit . entspricht beliebigem Zeichen Ich habe es mit einem umgekehrten Schrägstrich maskiert, damit es mit einem wörtlichen Punkt übereinstimmt. Das abschließende Leerzeichen stellt sicher, dass keine weiteren Zeichen auf die übereinstimmende Versionszeichenfolge folgen.


Sie können dies mit bash tun 's eingebauter Zeichenfolgenabgleich. Beachten Sie, dass hier Glob-Muster (Platzhalter) und keine regulären Ausdrücke verwendet werden.

if [[ $(cat /etc/redhat-release  | awk '{print $7}') == 7.[56] ]]

Oder wir eliminieren das UUoC:

if [[ $(awk '{print $7}' /etc/redhat-release) == 7.[56] ]]

oder...

if [[ $(cat /etc/redhat-release) == *" release 7."[56]" "* ]]

oder sogar (dank @kojiro)...

if [[ $(< /etc/redhat-release) == *" release 7."[56]" "* ]]

(Beachten Sie, dass Platzhalter am Anfang und am Ende benötigt werden, damit es mit der gesamten Zeile übereinstimmt. Das Leerzeichen in Anführungszeichen nach der Zahl soll sicherstellen, dass es nicht versehentlich mit "7.50" übereinstimmt.)

Oder wenn Sie wirklich reguläre Ausdrücke verwenden möchten, verwenden Sie =~ und wechseln Sie zur RE-Syntax:

if [[ $(< /etc/redhat-release) =~ " release 7."[56]" " ]]

(Beachten Sie, dass der Teil in Anführungszeichen wörtlich abgeglichen wird, also . muss nicht maskiert oder geklammert werden (solange Sie bash31 nicht aktivieren Kompatibilität). Und RE-Matches sind standardmäßig nicht verankert, also brauchen Sie nichts an den Enden wie im letzten.)


awk kann die ganze Arbeit von cat erledigen und [[...]] hier:

if
  </etc/redhat-release awk -v ret=1 '
    $7 ~ /^7\.[56]$/ {ret=0}
    END {exit(ret)}'
then
  ...

Oder einfach mit Standard sh Syntax mit einfachem Wildcard-Musterabgleich:

case $(cat /etc/redhat-release) in
  (*'release 7.'[56]' '*) ...;;
  (*) ...;;
esac

Linux
  1. Installieren Sie Binärdateien in /bin, /sbin, /usr/bin und /usr/sbin, Interaktionen mit --prefix und DESTDIR

  2. Regex-Muster zum Bearbeiten der /etc/sudoers-Datei

  3. Was ist der Unterschied zwischen #!/usr/bin/env bash und #!/usr/bin/bash?

  4. Bash-Eingabeaufforderung mit letztem Exit-Code

  5. Was ist die Verbindung zwischen den Verzeichnissen /etc/init.d und /etc/rcX.d in Linux?

Der richtige Weg zum Bearbeiten von /etc/passwd- und /etc/group-Dateien unter Linux

Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

Wie kann ich die Datei /etc/shadow und /etc/passwd mit Auditd auf Änderungen überwachen?

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

/etc/passwd zeigt Benutzer in einer Gruppe an, /etc/group jedoch nicht

Mit Feldtrenner sortieren