if mit regulärem Ausdruck im Bash-Code

if mit regulärem Ausdruck im Bash-Code

Ich bashhabe Folgendes gemacht. Dieser ifAusdruck wird ausgewertet, trueob die Redhat-Version 7.5 oder 7.6 ist.

if [[ ` cat /etc/redhat-release  | awk '{print $7}' ` == "7.5" ]] || [[ ` cat /etc/redhat-release  | awk '{print $7}' ` == "7.6" ]]
then
.
.
.

Können wir es mit regulären Ausdrücken eleganter machen?

Dies ist der Inhalt von /etc/redhat-release:

cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)

Antwort1

Viel einfacher ist es, den Release-String direkt zu überprüfen

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

Der grepBefehl stimmt mit regulärem Ausdruck überein. Das [56]Atom stimmt mit 5oder überein, sodass das Muster mit oder 6übereinstimmt . Da Übereinstimmungen7.57.6.beliebiges ZeichenIch habe es mit einem Backslash maskiert, sodass es einem wörtlichen Punkt entspricht. Das nachfolgende Leerzeichen stellt sicher, dass auf die übereinstimmende Versionszeichenfolge keine anderen Zeichen folgen.

Antwort2

bashSie können dies mit der integrierten Zeichenfolgenübereinstimmung tun . Beachten Sie, dass hierbei Glob-Muster (Platzhalter) und keine regulären Ausdrücke verwendet werden.

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

Oder, wenn wir dieUUoC:

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

oder...

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

oder sogar (danke an @kojiro) ...

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

(Beachten Sie, dass Platzhalter am Anfang und Ende erforderlich sind, damit die gesamte Zeile übereinstimmt. Das Leerzeichen in Anführungszeichen nach der Zahl soll sicherstellen, dass nicht versehentlich „7,50“ übereinstimmt.)

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

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

(Beachten Sie, dass der Teil in Anführungszeichen wörtlich abgeglichen wird und daher .nicht maskiert oder eingeklammert werden muss (solange Sie bash31die Kompatibilität nicht aktivieren). Und RE-Übereinstimmungen sind standardmäßig nicht verankert, daher benötigen Sie an den Enden nichts wie im letzten.)

Antwort3

awkkann die ganze Arbeit von catund [[...]]hier erledigen:

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

Oder einfach mit Standardsyntax shund einfachem Platzhaltermustervergleich:

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

Antwort4

Bash kann Feld 7 einer Zeile mit herausziehen read, und diese Dateien vom Typ "/etc/*-release" sind in der Regel sowieso einzeilig. Bedenken Sie

read _ _ _ _ _ _ ver _ < /etc/redhat-release
if [[ $ver = 7.[56] ]]; then
    # match
fi

verwandte Informationen