Saya ingin memberi tahu apakah string $stringakan dicocokkan dengan pola gumpalan $pattern. $stringmungkin atau mungkin bukan nama file yang ada. Bagaimana saya bisa melakukan ini?
Asumsikan format berikut untuk string input saya:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Saya ingin menemukan idiom bash yang menentukan apakah $stringakan dicocokkan oleh $pattern1, $pattern2atau pola segumpal sewenang-wenang lainnya. Inilah yang saya coba sejauh ini:
[[ "$string" = $pattern ]]Ini hampir berhasil, kecuali yang
$patternditafsirkan sebagai pola string dan bukan sebagai pola glob.[ "$string" = $pattern ]Masalah dengan pendekatan ini adalah yang
$patterndiperluas dan kemudian perbandingan string dilakukan antara$stringdan perluasan$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Yang ini berfungsi, tetapi hanya jika
$stringberisi file yang ada.[[ $string =~ $pattern ]]Ini tidak berfungsi karena
=~operator menyebabkan$patternditafsirkan sebagai ekspresi reguler yang diperluas, bukan pola gumpalan atau wildcard.
ls /foo/* sekarang kamu bisa mencocokkannya dalam
foo/{bar,baz}sebenarnya adalah ekspansi brace (bukan ekspansi parameter) sementara foo/*ekspansi pathname. $stringadalah ekspansi parameter. Ini semua dilakukan pada waktu yang berbeda dan dengan mekanisme yang berbeda.
casepernyataan melakukan Pathname Expansion ("globbing") sesuai dengan manual Bash.
{bar,baz}itu bukan pola. Ini ekspansi parameter. Perbedaan yang halus namun kritis dalam hal{bar,baz}itu diperluas sejak awal menjadi banyak argumen,bardanbaz.