Vorrei dire se una stringa $string
sarebbe abbinata a un modello glob $pattern
. $string
può 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 $string
sarebbe stato accompagnato da $pattern1
, $pattern2
o qualsiasi altro modello di glob arbitrario. Ecco cosa ho provato finora:
[[ "$string" = $pattern ]]
Funziona quasi, tranne per il fatto che
$pattern
viene interpretato come un modello di stringa e non come un modello glob.[ "$string" = $pattern ]
Il problema con questo approccio è che
$pattern
viene espanso e quindi viene eseguito il confronto tra stringhe$string
e l'espansione di$pattern
.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
Questo funziona, ma solo se
$string
contiene un file esistente.[[ $string =~ $pattern ]]
Questo non funziona perché l'
=~
operatore causa$pattern
l'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.
case
istruzione 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 argomentibar
ebaz
.