Ich würde gerne sagen, ob ein String $string
mit einem Glob-Muster übereinstimmt $pattern
. $string
kann 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 $string
würde durch abgestimmt werden $pattern1
, $pattern2
oder jedem anderen beliebigen glob Muster. Folgendes habe ich bisher versucht:
[[ "$string" = $pattern ]]
Dies funktioniert fast, außer dass dies
$pattern
als String-Muster und nicht als Glob-Muster interpretiert wird.[ "$string" = $pattern ]
Das Problem bei diesem Ansatz ist, dass
$pattern
erweitert wird und dann ein Zeichenfolgenvergleich zwischen$string
und der Erweiterung von durchgeführt wird$pattern
.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
Dieser funktioniert, aber nur, wenn er
$string
eine 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. $string
ist Parametererweiterung. Dies alles geschieht zu unterschiedlichen Zeiten und durch unterschiedliche Mechanismen.
case
erzielen 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,bar
undbaz
.