GNU/Linux >> Linux Esercitazione >  >> Linux

Espansione e variabili Bash Brace?

Questa domanda ha già risposte qui :Posso usare variabili all'interno di {} espansione senza `eval`?

(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"

Linux
  1. Spazi per le variabili nello script Bash?

  2. Usa variabili all'interno di {} Espansione senza `eval`?

  3. Funzioni nelle variabili Shell?

  4. Condivisione di variabili su più script di shell?

  5. Bash Brace Expansion Tutorial:6 esempi di espansione di espressioni all'interno di parentesi graffe

Bash Scripting:variabili spiegate con esempi

Come trovare la lunghezza della corda in Bash [Suggerimento rapido]

Funzione Bash per trovare il modello di corrispondenza dei file più recente

Modifica ricorsivamente le estensioni dei file in Bash

bash - trova la posizione dell'indice della stringa della sottostringa

Bash trova l'output dettagliato del comando