2013-07-12 6 views
49

Это, вероятно, очень простой вопрос, но по какой-то причине я, похоже, смотрю на очевидное.переменная интерполяция в оболочке

У меня есть переменная называется filepath=/tmp/name

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

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

`tail -1 $filepath_newstap.sh` 

Эта линия терпит неудачу, духу! потому что переменная не называется $filepath_newstap.sh

Как добавить _newstap.sh к имени переменной? Пожалуйста, обратите внимание, что задние тики предназначены для оценки экспрессии

ответ

102

Использования

"$filepath"_newstap.sh 

или

${filepath}_newstap.sh 

или

$filepath\_newstap.sh 

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

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

+4

Возможно, также упоминается' set -u', который заставляет сценарий прерываться, если вы ссылаетесь на неопределенную переменную. – tripleee

+0

@ tripleee: Обновлено, спасибо. – choroba

+0

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

10

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

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

Вам не нужно двойные кавычки? – michaelsnowden

+0

@michaelsnowden Не обязательно. Чтобы быть в безопасности, да, но вопрос явно указал путь без пробелов и далее предположил, что проблема была '$ filepath_newstap.sh' интерпретирована как' $ {filepath_newstap} .sh', а не предполагаемый '$ {filepath} _newstap .sh', что решило бы проблему. –

+0

Я не верю, что это правда: http://stackoverflow.com/a/6697781/2770572 – michaelsnowden

Смежные вопросы