Vorrei dire se una stringa $stringsarebbe abbinata a un modello glob $pattern. $stringpuò essere o meno il nome di un file esistente. Come posso fare questo?
Assumi i seguenti formati per le mie stringhe di input:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
Mi piacerebbe trovare un linguaggio bash che determina se $stringsarebbe stato accompagnato da $pattern1, $pattern2o qualsiasi altro modello di glob arbitrario. Ecco cosa ho provato finora:
[[ "$string" = $pattern ]]Funziona quasi, tranne per il fatto che
$patternviene interpretato come un modello di stringa e non come un modello glob.[ "$string" = $pattern ]Il problema con questo approccio è che
$patternviene espanso e quindi viene eseguito il confronto tra stringhe$stringe l'espansione di$pattern.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]Questo funziona, ma solo se
$stringcontiene un file esistente.[[ $string =~ $pattern ]]Questo non funziona perché l'
=~operatore causa$patternl'interpretazione come un'espressione regolare estesa, non un modello glob o jolly.
ls /foo/* ora puoi abbinarlo in a
foo/{bar,baz}realtà è un'espansione di parentesi graffe (non un'espansione dei parametri) mentre foo/*è l'espansione del percorso. $stringè l'espansione dei parametri. Tutto ciò avviene in momenti diversi e con meccanismi diversi.
caseistruzione esegue l'espansione Pathname ("globbing") secondo il manuale di Bash.
{bar,baz}non è uno schema. È l'espansione dei parametri. La differenza sottile ma critica in ciò{bar,baz}si espande molto presto in molteplici argomentibarebaz.