Bir dize $stringbir glob desen ile eşleşecek olup olmadığını söylemek istiyorum $pattern. $stringvarolan bir dosyanın adı olabilir veya olmayabilir. Bunu nasıl yapabilirim?
Giriş dizelerim için aşağıdaki biçimleri varsayalım:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Ben eğer belirleyen bir bash deyim bulmak istiyoruz $stringeşleşmesi olacağını $pattern1, $pattern2ya da başka herhangi keyfi glob desen. İşte şimdiye kadar denedim:
[[ "$string" = $pattern ]]Bu neredeyse işe yarıyor, ancak
$patternbir glob deseni olarak değil, bir dize deseni olarak yorumlanıyor.[ "$string" = $pattern ]Bu yaklaşımla ilgili sorun
$pattern, genişletilmiş ve daha sonra dize karşılaştırması ile$stringgenişlemesi arasında gerçekleştirilmiş olmasıdır$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Bu, yalnızca
$stringvar olan bir dosya içeriyorsa çalışır .[[ $string =~ $pattern ]]Bu işe yaramaz, çünkü
=~operatör$patternbir glob veya joker karakter kalıbı değil genişletilmiş düzenli bir ifade olarak yorumlanmasına neden olur .
ls /foo/* şimdi bir
foo/{bar,baz}, aslında bir brace genişletmesi (parametre genişletmesi değil) iken foo/*pathname genişletmesi olduğunu öğrendim . $stringparametre genişletmedir. Bunların hepsi farklı zamanlarda ve farklı mekanizmalarla yapılır.
caseifade Bash kılavuzuna göre Pathname Expansion ("globbing") gerçekleştirir.
{bar,baz}bir örüntü değil. Parametre genişletmesi. Bu konuda ince ama kritik fark{bar,baz}çok erken bir tarihte çoklu argümanlara genişletilirbarvebaz.