Bir dize $string
bir glob desen ile eşleşecek olup olmadığını söylemek istiyorum $pattern
. $string
varolan 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 $string
eşleşmesi olacağını $pattern1
, $pattern2
ya da başka herhangi keyfi glob desen. İşte şimdiye kadar denedim:
[[ "$string" = $pattern ]]
Bu neredeyse işe yarıyor, ancak
$pattern
bir 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$string
genişlemesi arasında gerçekleştirilmiş olmasıdır$pattern
.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
Bu, yalnızca
$string
var olan bir dosya içeriyorsa çalışır .[[ $string =~ $pattern ]]
Bu işe yaramaz, çünkü
=~
operatör$pattern
bir 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 . $string
parametre genişletmedir. Bunların hepsi farklı zamanlarda ve farklı mekanizmalarla yapılır.
case
ifade 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şletilirbar
vebaz
.