Interpolazione variabile nella shell


103

Ho una variabile chiamata filepath=/tmp/name.

Per accedere alla variabile, so di poterlo fare: $filepath

Nel mio script di shell ho tentato di fare qualcosa di simile (i backtick sono intesi)

`tail -1 $filepath_newstap.sh`

Questa riga fallisce, duuh !, perché la variabile non viene chiamata $filepath_newstap.sh

Come aggiungo _newstap.shal nome della variabile?

Si noti che i backtick sono destinati alla valutazione delle espressioni.

Risposte:


187

Uso

"$filepath"_newstap.sh

o

${filepath}_newstap.sh

o

$filepath\_newstap.sh

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

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


7
Forse menziona anche set -uquale causa l'interruzione dello script se fai riferimento a una variabile non definita.
tripleee

1
Qual è la differenza tra usare ${}e virgolette doppie? Dovrei preferire uno sull'altro?
user31389

3
@ user31389: la differenza è quando la variabile contiene spazi, quindi funzionano solo le virgolette doppie.
choroba

@choroba Il nome della variabile o il valore della variabile ?
Joshua Pinter

15

Usa le parentesi graffe intorno al nome della variabile:

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

1
Non hai bisogno di virgolette doppie?
michaelsnowden

@michaelsnowden Non necessariamente. Per sicurezza, sì, ma la domanda indicava esplicitamente un percorso senza spazi e suggeriva inoltre che il problema veniva $filepath_newstap.shinterpretato come ${filepath_newstap}.shpiuttosto che come previsto ${filepath}_newstap.sh, il che avrebbe risolto il problema.

@michaelsnowden Questo non mi dice nulla di cui non sia già a conoscenza. Perché pensi che siano necessarie le virgolette doppie?

Perché stai cercando di eseguire l'interpolazione di stringhe e hai bisogno di virgolette doppie per questo
michaelsnowden

@michaelsnowden L'espansione dei parametri avviene tra virgolette doppie o completamente al di fuori delle virgolette. Virgolette singole o caratteri di separazione con virgolette o altri caratteri non validi negli identificatori sono l'unico modo per impedire l'espansione dei parametri. Ad esempio, "$filepath"_fooe ${filepath}_foosi espandono entrambi in /tmp/name_foo. Tuttavia, '$filepath'_foo, "$"filepath_foo, e $"filepath"_foosarebbero tutti di espansione evitare completamente. Questo è il motivo export PATH=$PATH:$addpathper cui lavora per aggiungere :$addpath(che sarebbe soggetto all'espansione dei parametri) alla PATHvariabile d'ambiente.

3

In Bash:

tail -1 ${filepath}_newstap.sh
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.