Variable Interpolation in der Shell

103

Ich habe eine Variable namens filepath=/tmp/name.

Um auf die Variable zuzugreifen, weiß ich, dass ich dies tun kann: $filepath

In meinem Shell-Skript habe ich versucht, so etwas zu tun (die Backticks sind beabsichtigt)

`tail -1 $filepath_newstap.sh`

Diese Zeile schlägt fehl, duuh!, Weil die Variable nicht aufgerufen wird $filepath_newstap.sh

Wie hänge ich _newstap.shan den Variablennamen an?

Bitte beachten Sie, dass Backticks für die Ausdrucksbewertung vorgesehen sind.

Tawheed
quelle

Antworten:

186

Verwenden

"$filepath"_newstap.sh

oder

${filepath}_newstap.sh

oder

$filepath\_newstap.sh

_ist ein gültiges Zeichen in Bezeichnern. Punkt ist nicht, also versuchte die Shell zu interpolieren $filepath_newstap.

Sie können set -uden Shell-Exit mit einem Fehler ausführen, wenn Sie auf eine undefinierte Variable verweisen.

Choroba
quelle
7
Erwähnen Sie möglicherweise auch, set -uwas dazu führt, dass das Skript abgebrochen wird, wenn Sie auf eine undefinierte Variable verweisen.
Tripleee
1
Was ist der Unterschied zwischen der Verwendung von ${}und doppelten Anführungszeichen? Soll ich eins dem anderen vorziehen?
user31389
3
@ user31389: Der Unterschied besteht darin, dass nur doppelte Anführungszeichen funktionieren, wenn die Variable Leerzeichen enthält.
Choroba
@choroba Die Variablen Name oder die Variable Wert ?
Joshua Pinter
15

Verwenden Sie geschweifte Klammern um den Variablennamen:

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

quelle
1
Benötigen Sie keine doppelten Anführungszeichen?
michaelsnowden
@michaelsnowden Nicht unbedingt. Um sicher zu gehen, ja, aber die Frage gab ausdrücklich einen Pfad ohne Leerzeichen an und deutete weiter darauf hin, dass das Problem eher als beabsichtigt $filepath_newstap.shinterpretiert wurde , was das Problem lösen würde. ${filepath_newstap}.sh${filepath}_newstap.sh
@michaelsnowden Das sagt mir nichts, was mir noch nicht bewusst ist. Warum sind Ihrer Meinung nach doppelte Anführungszeichen erforderlich?
Weil Sie versuchen, eine Zeichenfolgeninterpolation durchzuführen, und dafür doppelte Anführungszeichen benötigen
michaelsnowden
@michaelsnowden Die Parametererweiterung erfolgt entweder in doppelten Anführungszeichen oder vollständig außerhalb von Anführungszeichen. Einfache Anführungszeichen oder das Trennen von Zeichen durch Anführungszeichen oder andere Zeichen, die in Bezeichnern nicht gültig sind, sind die einzige Möglichkeit, die Parametererweiterung zu verhindern. Zum Beispiel "$filepath"_foound ${filepath}_foowürde beide erweitern /tmp/name_foo. Allerdings '$filepath'_foo, "$"filepath_foound $"filepath"_foowürde alles vermeiden Expansion vollständig. Aus diesem Grund wird die Umgebungsvariable export PATH=$PATH:$addpathhinzugefügt :$addpath(was einer Parametererweiterung unterliegen würde) PATH.
3

In Bash:

tail -1 ${filepath}_newstap.sh
vyom
quelle