Переменная интерполяция в оболочке


105

У меня есть переменная с именем filepath=/tmp/name.

Я знаю, что могу сделать это, чтобы получить доступ к переменной: $filepath

В моем сценарии оболочки я попытался сделать что-то вроде этого (обратные кавычки предназначены)

`tail -1 $filepath_newstap.sh`

Эта строка не работает, черт возьми !, потому что переменная не вызывается $filepath_newstap.sh

Как добавить _newstap.shк имени переменной?

Обратите внимание, что обратные кавычки предназначены для оценки выражения.

Ответы:


189

Использовать

"$filepath"_newstap.sh

или

${filepath}_newstap.sh

или

$filepath\_newstap.sh

_- допустимый символ в идентификаторах. Точки нет, поэтому оболочка пыталась интерполировать $filepath_newstap.

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


7
Возможно также упомянуть, set -uчто вызывает прерывание скрипта, если вы ссылаетесь на неопределенную переменную.
Tripleee

1
В чем разница между использованием ${}и двойными кавычками? Должен ли я предпочесть одно другому?
user31389

3
@ user31389: разница в том, что когда переменная содержит пробелы, работают только двойные кавычки.
choroba

@choroba Переменные имени или переменное значение ?
Джошуа Пинтер,

16

Используйте фигурные скобки вокруг имени переменной:

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