(3 risposte)
Chiuso 6 anni fa.
Ho un comando trova:
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
Voglio sostituire Alpha,Bravo,Charlie
con $find_dir
find Directory/{$find_dir} arg1 arg2
tuttavia quest'ultimo si espande a
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
piuttosto allora
find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2
Come mai? Fa parte di uno script bash abbastanza complesso che potrebbe avere più o meno directory, non tutte rilevanti (quindi il globbing Upload/* non funzionerebbe). Quindi, se ne installo tre ora e ne aggiungo un altro, dovrò aggiungerlo manualmente in seguito. Inoltre ho bisogno che venga eseguito dalla radice delle directory per mantenere la prospettiva degli output dei risultati (./Upload/Dir/file invece di ./Dir/file).
Ma l'uso di una variabile mi permetterebbe di cambiarla secondo necessità e di mantenerla rilevante per altre parti dello script.
Risposta accettata:
Da bash
documentazione, sezione Espansione Brace:
L'espansione di parentesi viene eseguita prima di qualsiasi altra espansione e tutti i
caratteri speciali per altre espansioni vengono mantenuti nel risultato . È
è rigorosamente testuale. Bash non applica alcuna interpretazione sintattica
al contesto dell'espansione o al testo tra parentesi graffe. Per
evitare conflitti con l'espansione dei parametri, la stringa '${' non è
considerata idonea per l'espansione delle parentesi graffe.
Un'altra nota, in bash
:
L'ordine delle espansioni è:espansione di parentesi graffe, espansione di tilde,
espansione di parametri, variabili ed espansione aritmetica e sostituzione di comandi (da sinistra a destra) , suddivisione in parole ed espansione del nome file
.
Quindi nel tuo caso, bash
visto espansione parentesi graffa prima dell'espansione variabile, eseguirà prima l'espansione parentesi, producendo il risultato {Alpha,Bravo,Charlie}
.
Se puoi controllare $find_dir
contenuto variabile, puoi usare eval
:
eval "find Directory/{$find_dir} arg1 arg2"