2013-07-12 26 views
49

Questa è probabilmente una domanda molto semplice, ma per qualche motivo sembra essere fin troppo evidente.interpolazione variabile nella shell

ho una variabile chiamata filepath=/tmp/name

Per accedere alla variabile So che posso fare questo $filepath

Nel mio script di shell ho tentato di fare qualcosa di simile (Le zecche posteriori sono destinati)

`tail -1 $filepath_newstap.sh` 

Questa riga non funziona, duuh! perché la variabile non è denominata $filepath_newstap.sh

Come si aggiunge _newstap.sh al nome della variabile? Si prega di notare che le zecche posteriori sono destinati alla valutazione delle espressioni

risposta

102

Usa

"$filepath"_newstap.sh 

o

${filepath}_newstap.sh 

o

$filepath\_newstap.sh 

_ è un carattere valido negli identificatori. Dot non lo è, quindi la shell ha cercato di interpolare $filepath_newstap.

È possibile utilizzare set -u per far uscire la shell con un errore quando si fa riferimento a una variabile non definita.

+4

Forse anche menzionare' set -u' che fa sì che lo script di abortire se si fa riferimento una variabile non definita. – tripleee

+0

@ triple: aggiornato, grazie. – choroba

+0

Qual è la differenza tra l'uso di '$ {}' e virgolette doppie? Dovrei preferire uno rispetto all'altro? – user31389

10

Utilizzare parentesi graffe in tutto il nome della variabile:

`tail -1 ${filepath}_newstap.sh` 
+1

non Avete bisogno virgolette? – michaelsnowden

+0

@michaelsnowden Non necessariamente. Per sicurezza, sì, ma la domanda indicava esplicitamente un percorso senza spazi e suggeriva inoltre che il problema era '$ filepath_newstap.sh' interpretato come' $ {filepath_newstap} .sh' invece del previsto '$ {filepath} _newstap .sh', che risolverebbe il problema. –

+0

Non credo sia vero: http://stackoverflow.com/a/6697781/2770572 – michaelsnowden

3

In bash: tail -1 ${filepath}_newstap.sh

Problemi correlati