2010-10-13 13 views
16

Se si dispone di una variabile che contiene un simbolo di dollaro senza caratteri di escape, esiste un modo per rieseguire l'intero contenuto della variabile?Come richiamare una variabile contenente un segno di dollaro senza escape nella bash

Per esempio qualcosa chiama uno script:

./script.sh "test1$test2"

e poi se voglio utilizzare il parametro diventa "troncato" in questo modo:

echo ${1}
test1

Naturalmente singolo citare il nome varaible non aiuta. Non riesco a capire come citarla in modo da poter almeno sfuggire al segno del dollaro me stesso una volta che lo script riceve il parametro.

risposta

7

La variabile viene sostituita prima dell'esecuzione dello script.

./script.sh 'test1$test2' 
+0

Sì, questo sembra essere il caso :) – Not22

+0

Ci sono altre situazioni anche se effettivamente ho variabili con segni di dollaro senza escape, come quando sto leggendo i dati da file. Quindi voglio chiamare il mio script con questi dati, quindi è la mia unica opzione per sed l'intero file prima di leggerlo? – Not22

+1

La lettura dei dati dai file non esegue la sostituzione delle variabili. –

28

Il problema è che lo script riceve "test1" in primo luogo e non può sapere che c'era un riferimento a una variabile vuota (nero). Bisogna sfuggire alla $ prima di passarlo allo script, in questo modo:

./script.sh "test1\$test2" 

Oppure utilizzare le virgolette singole ' come questo:

./script.sh 'test1$test2' 

Nel qual caso bash non si espanderà variabili da quella stringa di parametri .

0

Come ha detto Ignacio, la variabile viene sostituita, quindi i tuoi script ottengono ./script.sh test1 come valori per $0 e $1.

Ma anche nel caso in cui hai utilizzato le virgolette letterali per passare l'argomento, devi sempre citare "$1" nel tuo echo "${1}". Questa è una buona pratica.

+0

E le parentesi * non * sono necessarie, poiché si tratta di una semplice sostituzione. –

+0

sì, non sono necessari. Usarli è solo opzionale. – Benoit

4

utilizzando virgolette singole, metadati come $ manterranno il suo valore letterale. Se vengono utilizzate virgolette doppie, i nomi delle variabili verranno interpolati.

Problemi correlati