Переменная в операторе обратной кавычки

У меня есть эта проблема, я не могу прийти в себя.

FILE_PROPERTIES="info.txt"

echo `grep "ENVOI_MAIL=" ${FILE_PROPERTIES} | cut -d "=" -f "2"`

Мои FILE_PROPERTIES во второй строке не меняются, как я ожидал, и заканчиваются исключением: файл не найден. Кто-нибудь знает, почему это так?

Или, в более общем смысле, как можно вызвать переменную в операторе ``, чтобы она была преобразована для вывода? Я пробовал без {}, но безуспешно.


sh
person y2k    schedule 09.01.2012    source источник
comment
Что это за среда? Тег пакетной обработки предназначен для пакетных файлов Windows, но это не похоже на синтаксис пакетной обработки Windows.   -  person Cheran Shunmugavel    schedule 09.01.2012
comment
@CheranShunmugavel спасибо! ошибся, я обновил тег.   -  person y2k    schedule 09.01.2012
comment
Здесь работает (bash 4.1.10). Вероятно, зависит от типа оболочки и, возможно, версии. export FILE_PROPERTIES="info.txt" работает?   -  person Daniel Fischer    schedule 10.01.2012
comment
@DanielFischer Спасибо, сейчас я использую sh-3.2. Посмотрю на его обновление.   -  person y2k    schedule 18.01.2012


Ответы (1)


То, как вы это делаете, должно работать. Например, следующее должно (попытаться) получить доступ как к info.txt, так и к something_else.txt. Обратите внимание, что две команды echo идентичны.

#!/bin/sh

FILE_PROPERTIES="info.txt"
echo `grep "ENVOI_MAIL=" ${FILE_PROPERTIES} | cut -d "=" -f "2"`

FILE_PROPERTIES="something_else.txt"
echo `grep "ENVOI_MAIL=" ${FILE_PROPERTIES} | cut -d "=" -f "2"`

Одна из возможных проблем заключается в том, что если имя файла содержит пробелы, оно будет отображаться для команды grep как два аргумента. Вы можете избежать этого, используя кавычки (в любом случае, неплохая идея). (В этом случае фигурные скобки не требуются, но идея тоже неплохая.)

echo `grep "ENVOI_MAIL=" "${FILE_PROPERTIES}" | cut -d "=" -f "2"`

Кроме того, большинство современных оболочек поддерживают синтаксис $(...), который немного удобнее, чем форма обратной кавычки (во-первых, она может быть вложенной):

echo $(grep "ENVOI_MAIL=" "${FILE_PROPERTIES}" | cut -d "=" -f "2")

Наконец, echo, вероятно, не нужен, если вам действительно не нужна обработка пробелов echo. Вы можете попробовать это вместо этого:

grep "ENVOI_MAIL=" "${FILE_PROPERTIES}" | cut -d "=" -f "2"

(Я не проверял все эти команды, поэтому следите за опечатками.)

person Keith Thompson    schedule 10.01.2012
comment
Спасибо за такой четкий, исчерпывающий и информативный ответ! Помогли мне хорошо понять, что происходит. Теперь хорошо работает в партии 0403-010. - person y2k; 18.01.2012