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ń.

tawheed
źródło

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.

choroba
źródło
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`

źródło
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.
3

W Bash:

tail -1 ${filepath}_newstap.sh
vyom
źródło