Ich würde gerne sagen, ob ein String $stringmit einem Glob-Muster übereinstimmt $pattern. $stringkann oder kann nicht der Name einer vorhandenen Datei sein. Wie kann ich das machen?
Angenommen, die folgenden Formate für meine Eingabezeichenfolgen:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Ich möchte eine bash Idiom finden, wenn bestimmt $stringwürde durch abgestimmt werden $pattern1, $pattern2oder jedem anderen beliebigen glob Muster. Folgendes habe ich bisher versucht:
[[ "$string" = $pattern ]]Dies funktioniert fast, außer dass dies
$patternals String-Muster und nicht als Glob-Muster interpretiert wird.[ "$string" = $pattern ]Das Problem bei diesem Ansatz ist, dass
$patternerweitert wird und dann ein Zeichenfolgenvergleich zwischen$stringund der Erweiterung von durchgeführt wird$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Dieser funktioniert, aber nur, wenn er
$stringeine Datei enthält, die existiert.[[ $string =~ $pattern ]]Dies funktioniert nicht, da der
=~Operator bewirkt$pattern, dass er als erweiterter regulärer Ausdruck interpretiert wird, nicht als Glob- oder Platzhaltermuster.
ls /foo/*
foo/{bar,baz}es sich tatsächlich um eine Klammererweiterung (keine Parametererweiterung) handelt, während foo/*es sich um eine Pfadnamenerweiterung handelt. $stringist Parametererweiterung. Dies alles geschieht zu unterschiedlichen Zeiten und durch unterschiedliche Mechanismen.
caseerzielen möchten , führt die Anweisung die Pfadnamenerweiterung ("Globbing") gemäß dem Bash-Handbuch aus.
{bar,baz}es sich nicht um ein Muster handelt. Es ist eine Parametererweiterung. Dezent , aber entscheidender Unterschied, dass{bar,baz}sehr früh erweitert auf in mehrere Argumente,barundbaz.