Zmienna interpolacja w powłoce


104

Mam zmienną o nazwie filepath=/tmp/name.

Aby uzyskać dostęp do zmiennej, wiem, że mogę to zrobić: $filepath

W moim skrypcie powłoki próbowałem zrobić coś takiego (znaki odwrotne są przeznaczone)

`tail -1 $filepath_newstap.sh`

Ta linia zawodzi, duuh!, Ponieważ zmienna nie jest wywoływana $filepath_newstap.sh

Jak dołączyć _newstap.shdo nazwy zmiennej?

Zwróć uwagę, że lewy apostrof są przeznaczone do oceny wyrażeń.

Odpowiedzi:


187

Posługiwać się

"$filepath"_newstap.sh

lub

${filepath}_newstap.sh

lub

$filepath\_newstap.sh

_jest prawidłowym znakiem w identyfikatorach. Kropka nie jest, więc powłoka próbowała interpolować $filepath_newstap.

Możesz użyć set -udo wyjścia powłoki z błędem, gdy odwołujesz się do niezdefiniowanej zmiennej.


7
Może również wspomnieć, set -uco powoduje przerwanie działania skryptu, jeśli odwołasz się do niezdefiniowanej zmiennej.
tripleee

1
Jaka jest różnica między używaniem ${}a cudzysłowami podwójnymi? Czy powinienem preferować jedno nad drugim?
user31389

3
@ user31389: Różnica polega na tym, że gdy zmienna zawiera białe znaki, działają tylko podwójne cudzysłowy.
choroba

@choroba Zmienne nazwa lub zmienna wartość ?
Joshua Pinter

16

Użyj nawiasów klamrowych wokół nazwy zmiennej:

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

1
Nie potrzebujesz podwójnych cudzysłowów?
michaelsnowden

@michaelsnowden Niekoniecznie. Aby być bezpiecznym, tak, ale pytanie wyraźnie określało ścieżkę bez spacji i dalej sugerowało, że problem był $filepath_newstap.shinterpretowany jako ${filepath_newstap}.shraczej niż zamierzony ${filepath}_newstap.sh, co miałoby rozwiązać problem.

@michaelsnowden To nie mówi mi nic, o czym jeszcze nie wiem. Jak myślisz, dlaczego wymagane są podwójne cudzysłowy?

Ponieważ próbujesz wykonać interpolację ciągów i potrzebujesz do tego podwójnych cudzysłowów
michaelsnowden

@michaelsnowden Rozwinięcie parametrów następuje w podwójnych cudzysłowach lub całkowicie poza cudzysłowami. Pojedyncze cudzysłowy lub oddzielanie znaków cudzysłowami lub innymi znakami, które nie są prawidłowe w identyfikatorach, to jedyny sposób, aby zapobiec interpretacji parametrów. Na przykład "$filepath"_fooi ${filepath}_foooba rozwiną się do /tmp/name_foo. Jednak '$filepath'_foo, "$"filepath_fooi $"filepath"_fooże wszyscy ekspansja uniknąć całkowicie. Dlatego export PATH=$PATH:$addpathpracuje nad dodaniem :$addpath(co podlegałoby rozszerzeniu parametrów) do PATHzmiennej środowiskowej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.