2013-04-02 7 views
5

Ho un variabile che contiene questo tipo di stringa:Come si espandono le variabili in una variabile bash senza carattere jolly espandibile?

var='$FOO/bar/baz*' 

e voglio sostituire la $ FOO variabile dal suo contenuto. Tuttavia, quando faccio

var=$(eval "echo $var") 

La variabile viene sostituito, ma la stella è anche sostituito in modo che var ora contiene ogni possibile corrispondenza nel mio file system (come se scheda premuto in un guscio). ad esempio, se $ FOO contiene/home, var conterrà "/home/bar/baz1.sh /home/bar/baz2.sh /home/bar/baz.conf"

Come sostituire la variabile senza espandere i caratteri jolly?

+0

Vedi anche http://mywiki.wooledge.org/TemplateFiles –

+0

Se il vostro obiettivo è quello di disattivare solo globbing, 'set -f' lo farà. Se il vostro obiettivo è quello di fare la valutazione del modello di sicurezza ... beh, non c'è nulla di _safe_ sui modelli in bash, dal momento che non è possibile disabilitare la sostituzione di comando; cioè, un modello che contiene '$ (rm -rf" $ HOME ")' farà proprio questo. –

risposta

5

Spegnere globbing in bash, quindi riattivare esso.

set -f 
var="$FOO/bar/baz*" 
set +f 
1

Basta inserire le virgolette:

var=$FOO/bar/baz/* 

Globs non vengono espansi sul RHS di un assegnamento di variabile.

+0

Cringe come da me suggerito, ma che ne dici: 'var = '$ FOO/bar/baz *'; eval "expandedvar = $ var" '(attenzione:' eval' apre la porta per così tanti modi per le cose da andare male non è nemmeno divertente). –

+0

Non sono sicuro del motivo per cui "eval" sia necessario. Nella mia risposta, il valore di 'var' sarà" whateverwasinfoo/bar/baz/* ". La variabile '$ FOO' è espansa, la stella no. Sto fraintendendo la domanda? – chepner

+0

La mia comprensione era che lui ha già un set variabile '$ FOO/bar/baz *' (o qualcosa di simile), non è che lo script conterrà direttamente che stringa. –

Problemi correlati