Ich bash
habe Folgendes gemacht. Dieser if
Ausdruck wird ausgewertet, true
ob 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 grep
Befehl stimmt mit regulärem Ausdruck überein. Das [56]
Atom stimmt mit 5
oder überein, sodass das Muster mit oder 6
übereinstimmt . Da Übereinstimmungen7.5
7.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
bash
Sie 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 bash31
die Kompatibilität nicht aktivieren). Und RE-Übereinstimmungen sind standardmäßig nicht verankert, daher benötigen Sie an den Enden nichts wie im letzten.)
Antwort3
awk
kann die ganze Arbeit von cat
und [[...]]
hier erledigen:
if
</etc/redhat-release awk -v ret=1 '
$7 ~ /^7\.[56]$/ {ret=0}
END {exit(ret)}'
then
...
Oder einfach mit Standardsyntax sh
und 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