Wie man in Bash Strings partiell vergleicht

Bash Stringvergleiche sind einfach :

if [ "$a" == "$b" ]; then 
          echo "gleich"
fi

Aber manchmal will man ja was auch nur Teilmengen vergleichen. Dazu braucht man die Doppelklammer und die Wildcards:

if [[ "$CERTNAME" == *"$HOSTNAME"* ]]; then
        echo "Teilvergleich erfolgreich"
fi

Wenn also HOSTNAME ein Teil von CERTNAME ist, dann trifft das obige zu. Wenn man == durch != ersetzt, kann man das Gegenteil abfragen. Es gibt aber noch einen anderen Weg, über RegExpressions:

if [[ "$CERTNAME" =~ .*$HOSTNAME.* ]]; then
   echo "RegExp ist gültig"
fi

Das hat den Vorteil, daß es auch etwas komplizierteres sein darf:

if [[ "$A" =~ .*(ab|vom).* ]]; then

Viel Spaß damit.

One thought on “Wie man in Bash Strings partiell vergleicht

  1. [[ ist ein reserviertes Wort; das Quoten von Variablen zwischen [[ und ]] ist unnötig. Dass „(ab|vom)“ ohne Quoting funktioniert, hat man auch nur dem Charakter als reserviertes Wort zu verdanken.

    Ebenso ist es sinnlos, einem regulären Ausdruck .* voranzustellen oder es dranzuhängen:

    foo ist äquivalent zu .*foo.* und ^.*foo.*$, aber nicht zu ^foo$

    „RegExp ist gültig“ ist etwas unglücklich formuliert, auch wenn das Ergebnis formal korrekt ist: Der Test liefert den exit code 0, wenn der reguläre Ausdruck gültig ist und auf den String passt, den exit code 1, wenn der reguläre Ausdruck gültig ist und nicht passt, und den exit code 2, wenn der reguläre Ausdruck an sich fehlerhaft ist.

Schreibe einen Kommentar