Я хотел бы сказать, будет ли строка $stringсоответствовать шаблону глобуса $pattern. $stringможет или не может быть имя существующего файла. Как я могу это сделать?
Предположим следующие форматы для моих входных строк:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Я хотел бы найти Баш идиому , который определяет , если $stringбудет сопровождаться $pattern1, $pattern2или любым другим произвольным шаблоном Глоб. Вот что я пробовал до сих пор:
[[ "$string" = $pattern ]]Это почти работает, за исключением того, что
$patternинтерпретируется как строковый шаблон, а не как шаблон глобуса.[ "$string" = $pattern ]Проблема этого подхода заключается в том, что
$patternон расширяется, а затем выполняется сравнение строк$stringи расширение$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Это работает, но только если
$stringсодержит файл, который существует.[[ $string =~ $pattern ]]Это не работает, потому что
=~оператор$patternинтерпретируется как расширенное регулярное выражение, а не как шаблон глобуса или шаблона.
ls /foo/* теперь вы можете соответствовать в
foo/{bar,baz}на самом деле это расширение скобок (не расширение параметров), а foo/*расширение путей. $stringэто расширение параметра. Все это делается в разное время и разными механизмами.
caseглобом , оператор выполняет расширение имени («глобализация») в соответствии с руководством по Bash.
{bar,baz}это не шаблон. Это расширение параметров. Тонкое, но критическое различие в этом{bar,baz}очень рано раскрывается в нескольких аргументах,barиbaz.