Come posso usare una variabile Bash (stringa) contenente le virgolette in un comando?


Risposte:


56

Risposta breve: vedi BashFAQ # 50 ("Sto cercando di inserire un comando in una variabile, ma i casi complessi falliscono sempre!").

Risposta lunga: inserire comandi (o parti di comandi) in variabili e poi ripristinarli intatti è complicato. Quando la shell espande una variabile sulla riga di comando, se la variabile era tra virgolette non viene analizzata; se non era tra virgolette, gli spazi in esso vengono analizzati come interruzioni di argomento, ma le virgolette e l'escape non vengono analizzate. In entrambi i casi, inserire le virgolette nel valore della variabile non fa nulla di utile.

Di solito, il modo migliore per fare questo genere di cose è usare un array invece di una semplice variabile di testo:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

Santo Jezus funziona!
Slawomir,


-2

Non vedo il problema:

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

Forse devi citare di nuovo il valore:

$ rsync "$FLAGS" dir1 dir2

5
echonon sta mostrando quello che pensi che sia. Prova printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"a capire perché nessuna di queste opzioni funziona.
Gordon Davisson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.