Chciałbym powiedzieć, czy ciąg $stringpasowałby do wzorca globu $pattern. $stringmoże, ale nie musi, być nazwą istniejącego pliku. W jaki sposób mogę to zrobić?
Przyjmij następujące formaty dla moich ciągów wejściowych:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Chciałbym znaleźć idiom bash, który określa, czy $stringbędzie dopasowane $pattern1, $pattern2lub jakiegokolwiek innego arbitralnego glob wzorca. Oto, co próbowałem do tej pory:
[[ "$string" = $pattern ]]To prawie działa, ale
$patternjest interpretowane jako wzorzec łańcucha, a nie jako wzorzec globalny.[ "$string" = $pattern ]Problem z tym podejściem polega na tym, że
$patternjest on rozwijany, a następnie przeprowadzane jest porównywanie ciągów znaków$stringz rozszerzeniem$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Ten działa, ale tylko wtedy, gdy
$stringzawiera plik, który istnieje.[[ $string =~ $pattern ]]To nie działa, ponieważ
=~operator powoduje$patterninterpretację jako rozszerzone wyrażenie regularne, a nie wzorzec globalny lub symbol wieloznaczny.
ls /foo/* teraz możesz dopasować
foo/{bar,baz}tak naprawdę jest to rozwinięcie nawiasów klamrowych (a nie rozszerzenie parametrów), podczas gdy foo/*jest to rozwinięcie nazwy ścieżki. $stringto rozszerzenie parametrów. Wszystko to odbywa się w różnym czasie i za pomocą różnych mechanizmów.
caseinstrukcja wykonuje rozszerzenie nazwy ścieżki („globbing”) zgodnie z instrukcją Bash.
{bar,baz}to nie jest wzór. To rozszerzenie parametrów. Subtelna, ale krytyczna różnica w tym{bar,baz}jest bardzo wcześnie rozszerzona na wiele argumentówbaribaz.