2017-07-23 4 views
1
# Checking if we dealing with 1050 or 1050 Ti 
function gpu_check() { 
    test="GPU 0: GeForce GTX 1050 (UUID: GPU-97acce0b-4304-01e9-ef9d-bc3230cae912)" 
    echo "testing $test" 
    if [[ $test =~ "\sGTX\s1050\s" ]]; then 
    echo "foud 1050" 
    else 
    echo "no 1050's here" 
    fi 
} 

ich versuche Regex zu verwenden, aber alle möglichen Varianten Ich kann mir vorstellen, wie doppelte \, das Hinzufügen * und *. „$ Test“ verwenden und vieles mehr, was mich nicht was ich erwarte.So verwenden regexp in Bash-Skript

Tests GPU 0: GeForce GTX 1050 (UUID: GPU-97acce0b-4304-01e9-ef9d-bc3230cae912)

keine 1050 ist hier

Wie ich es funktioniert?

+1

'\ s' ist ein PCRE-ism. Es ist nicht verfügbar in BRE oder ERE Regex-Syntax. –

+0

Was soll ich verwenden? – kusayu

+3

@medik, falsch - Bash hat Regex-Syntax. Und bitte, ** bitte **, raten Sie den Leuten nicht, das ABS als Referenz zu verwenden - es sind die W3Schools des Shell-Scripts, voll von schlechten Beispielen und veraltetem Inhalt. –

Antwort

3
re='[[:space:]]GTX[[:space:]]1050[[:space:]]' 
[[ $test =~ $re ]] 

... wird den Trick machen.

  • \s ist die PCRE-Syntax. =~ garantiert nur die POSIX ERE-Syntax, daher sind PCRE-Erweiterungen nicht verfügbar. [[:space:]] ist das POSIX-konforme Äquivalent.
  • Sie können die Regex nicht zitieren, ohne sie literal zu machen. Das heißt - es muss =~ $re und nicht =~ "$re" sein, wenn Sie wollen, dass der Wert in re als ein regulärer Ausdruck und nicht als eine exakte zu suchende Zeichenfolge behandelt wird.

aus der Dokumentation auf the bash-hackers wiki Zitiert:

mittels Operator = ~, der linke Seite Operand abgestimmt gegen den erweiterten regulären Ausdruck (ERE) auf der rechten Seite.

Dies entspricht dem Vergleich mit Mustern: Jeder zitierte Teil des regulären Ausdrucks wird wörtlich genommen, auch wenn er Sonderzeichen für reguläre Ausdrücke enthält.

Es empfiehlt sich, den regulären Ausdruck in eine Variable zu übernehmen. Dies dient dazu, Shell-Parsing-Fehler bei ansonsten gültigen regulären Ausdrücken zu vermeiden.

+0

Bearbeiten Sie den Tippfehler bitte und ich werde Ihre Antwort akzeptieren. re = 'bla " – kusayu

+0

Und vielen Dank! – kusayu

+0

Fest, danke für den Fang. –