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 $path1
es 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 path1
und 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 compat31
Option oder setzen BASH_COMPAT=3.1
).