Интерпретация переменных сценария Bash - PullRequest
0 голосов
/ 26 января 2012

У меня есть текстовый файл, который содержит ссылки на переменные и позволяет пользователю настроить желаемое форматирование вокруг переменных, скажем что-то вроде

 The date is $DATE
 The time is $TIME

Затем я хочу прочитать этот текстовый файл, заменить переменные и распечатать результат на стандартный вывод, используя скрипт bash. Самая близкая вещь, которую я получил, использует "echo", чтобы вывести это,

 DATE="1/1/2010"
 TIME="12:00"
 TMP=`cat file.txt`
 echo $TMP

Однако вывод заканчивается на одной строке, и я не хочу иметь \ n в конце каждой строки в текстовом файле. Я попытался использовать "cat << $ TMP", но тогда нет новых строк и переменные внутри текста не заменяются значениями. </p>

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Вы можете использовать eval, чтобы убедиться, что переменные раскрыты в вашем файле данных:

DATE="1/1/2010"
TIME="12:00"
while read line
do
  eval echo ${line}
done < file.txt

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

Если входной файл находится вне вашего контроля, гораздо более безопасным решением будет:

DATE="1/1/2010"
TIME="12:00"
sed -e "s#\$DATE#$DATE#" -e "s#\$TIME#$TIME#" < file.txt

Предполагается, что ни $DATE, ни $TIME не содержат символ # и что никакие другие переменные не должны раскрываться.

0 голосов
/ 26 января 2012

Просто заключите в кавычки вашу переменную для сохранения символов новой строки.

DATE="1/1/2010"
TIME="12:00"
TMP=$(cat file.txt)
echo "$TMP"

Для изменения значений в файле с переменными вы можете сделать -

while read -r line
do 
   sed -e "s@\$DATE@$DATE@" -e "s@\$TIME@$TIME@" <<< "$line"
done < file.txt

Тест:

[jaypal:~/Temp] cat file.txt
The date is $DATE
The time is $TIME
[jaypal:~/Temp] DATE="1/1/2010"
[jaypal:~/Temp] TIME="12:00"
[jaypal:~/Temp] while read -r line; do sed -e "s@\$DATE@$DATE@" -e "s@\$TIME@$TIME@" <<< "$line"; done < file.txt
The date is 1/1/2010
The time is 12:00
0 голосов
/ 26 января 2012

Чуть более компактно, чем ответ Адама:

DATE="1/1/2010"
TIME="12:00"
TMP=`cat file.txt`
eval echo \""$TMP"\"

Недостатком всего этого является то, что вы в конечном итоге раздаваете цитаты. Лучше использовать реальный шаблон. Я не уверен, как это сделать в оболочке, поэтому я бы использовал другой язык, если это вообще возможно. Плюсом создания шаблонов является то, что вы можете устранить ту дыру «произвольной команды», о которой упоминает Адам, без написания кода, столь же безобразного, как sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...