Змінна інтерполяція в оболонці


103

У мене є змінна назва filepath=/tmp/name.

Для доступу до змінної я знаю, що можу це зробити: $filepath

У своєму скрипті оболонки я намагався зробити щось подібне (задні посилання призначені)

`tail -1 $filepath_newstap.sh`

Цей рядок виходить з ладу, duuh !, тому що змінна не викликається $filepath_newstap.sh

Як додати _newstap.shім'я змінної?

Будь ласка, зауважте, що задні посилання призначені для оцінки виразів.

Відповіді:


186

Використовуйте

"$filepath"_newstap.sh

або

${filepath}_newstap.sh

або

$filepath\_newstap.sh

_є дійсним символом в ідентифікаторах. Крапки немає, тому оболонку намагалися інтерполювати $filepath_newstap.

Ви можете використовувати set -uдля виходу з оболонки з помилкою, коли ви посилаєтесь на невизначену змінну.


7
Можливо, також згадайте, set -uщо спричиняє скасування сценарію, якщо ви посилаєтесь на невизначену змінну.
tripleee

1
Яка різниця між використанням ${}та подвійними лапками? Чи варто віддати перевагу одному над іншим?
користувач31389

3
@ user31389: Різниця полягає в тому, коли змінна містить пробіл, тоді працюють лише подвійні лапки.
choroba

@choroba Змінні імені або змінне значення ?
Джошуа Пінтер

15

Використовуйте фігурні дужки навколо назви змінної:

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

1
Вам не потрібні подвійні цитати?
michaelsnowden

@michaelsnowden Не обов'язково. Безпечно, так, але в цьому питанні явно було вказано шлях без пробілів, і далі було висловлено припущення, що проблема $filepath_newstap.shне тлумачиться як ${filepath_newstap}.shпередбачувана ${filepath}_newstap.sh, що вирішить проблему.

@michaelsnowden Це нічого не говорить про мене, про що я вже не знаю. Чому, на вашу думку, потрібні подвійні котирування?

Тому що ви намагаєтеся зробити інтерполяцію рядків, і вам потрібні подвійні лапки
michaelsnowden

@michaelsnowden Розширення параметрів відбувається або в подвійних лапках, або поза лапками повністю. Одиночні лапки або розділення символів цитатами або іншими символами, недійсними в ідентифікаторах - єдиний спосіб запобігти розширенню параметрів. Наприклад, "$filepath"_fooі ${filepath}_fooобидва розшириться до /tmp/name_foo. Однак '$filepath'_foo, "$"filepath_fooі $"filepath"_fooбуде все розширення повністю уникнути. Ось чому export PATH=$PATH:$addpathпрацює над додаванням :$addpath(що підлягає розширенню параметрів) PATHзмінної середовища.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.