Saya ingin memberi tahu apakah string $string
akan dicocokkan dengan pola gumpalan $pattern
. $string
mungkin 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 $string
akan dicocokkan oleh $pattern1
, $pattern2
atau pola segumpal sewenang-wenang lainnya. Inilah yang saya coba sejauh ini:
[[ "$string" = $pattern ]]
Ini hampir berhasil, kecuali yang
$pattern
ditafsirkan sebagai pola string dan bukan sebagai pola glob.[ "$string" = $pattern ]
Masalah dengan pendekatan ini adalah yang
$pattern
diperluas dan kemudian perbandingan string dilakukan antara$string
dan perluasan$pattern
.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
Yang ini berfungsi, tetapi hanya jika
$string
berisi file yang ada.[[ $string =~ $pattern ]]
Ini tidak berfungsi karena
=~
operator menyebabkan$pattern
ditafsirkan 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. $string
adalah ekspansi parameter. Ini semua dilakukan pada waktu yang berbeda dan dengan mekanisme yang berbeda.
case
pernyataan 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,bar
danbaz
.