Bash: Regex zum Vergleichen von Dateipfaden

Bash: Regex zum Vergleichen von Dateipfaden

Ich möchte prüfen, ob eine Eingabezeichenfolge mit den auf der Whitelist aufgeführten Dateipfaden übereinstimmt, und erst dann eine Operation ausführen.

Ich mache so etwas

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Wo, wenn Pfade sind wie

mydir/test/dir
mydir/othertest/dir

Diese sollten bestanden werden.

Bei der obigen Prüfung tritt ein Fehler auf.

assets/bin/copymain: line 8: [: too many arguments

Antwort1

Beachten Sie, dass reguläre Ausdrücke nicht erforderlich sind, wenn die einzige Anforderung darin besteht, Pfade/Zeichenfolgen zu vergleichen, die auf eine bestimmte Weise enden oder beginnen:

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

Antwort2

path1="mydir/**"
path2="mydir/testing"

Hier path1="mydir/**"wird ein Globbing-Muster verwendet, das eine völlig andere Sprache ist als der im Vergleich verwendete erweiterte RegEx.

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Die Bedingungen verwenden jedoch einen regulären Ausdruck:

[[ "$path2" =~ "$path1" ]]

Fügen Sie keine Leerzeichen zwischen [ [und ein ] ], sondern[[]]

Parametererweiterungs-Globbing und Regex sind zwei verschiedene Mustersprachen.

Wenn $path1es das Whitelist-Muster enthält, müssen Sie es in RegEx wie folgt schreiben:

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

Die rechte Seite ist die RegEx-Variable path1und sie darf nicht in Anführungszeichen gesetzt werden, da dies dazu führen würde, dass RegExp-Operatoren (wie ^oben) wörtlich genommen werden (es sei denn, Sie setzen die compat31Option oder setzen BASH_COMPAT=3.1).

verwandte Informationen