LINUX.ORG.RU

Разбор кода на bash

 , ,


0

1

Здравствуйте. Для маленького проекта понадобилось найти что-то вроде шаблонизарота на bash. Его я нашел, вот код:

   #!/bin/bash
   config_file='test.conf'
   template_file='mytemplate'
   myvar1='variable 1'
   template=`cat ${template_file}`
   eval "echo \"${template}\"" > ${config_file}

(Источник)

Код работает, проблем с ним нет. Однако, хотелось бы понять, как он работает.

Читал про eval - не совсем понял, почему он в данном случае работает так (в текст подставляет значение переменной). Также, не совсем понятно для чего после знакана переменной, а именно «$» имя переменной берут в фигурные скобки {}. Есть ли отличие от простого $var_name

Заранее спасибо.



Последнее исправление: balzi (всего исправлений: 1)

Читал про eval - не совсем понял, почему он в данном случае работает так (в текст подставляет значение переменной).

Это не он подставляет значение, это bash подставляет значение в echo. Пример:

$ echo "$HOME"

А eval нужен только для того, чтобы ты мог пихать в свой шаблон любую ахинею.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)

Также, не совсем понятно для чего после знакана переменной, а именно «$» имя переменной берут в фигурные скобки {}. Есть ли отличие от простого $var_name

чтоб точно отделить, где заканиваеться переменная и начинается строка.

Типа

foo=12345
echo ${foo}bar
12345bar

PunkoIvan ★★★★
()

Читал про eval - не совсем понял, почему он в данном случае работает так (в текст подставляет значение переменной).

Он выполняет команду echo, в которую подставляет содержимое template.

Там будет выполнено то же, что было бы выполнено при такой команде:

echo "<содержимое файла mytemplate>" > test.conf

Есть ли отличие от простого $var_name

Небольшое. Есть тебе надо вывести foo${bar}ololo - то ты не сможешь это сделать без ${}. Ещё в ${} можно добавлять модификаторы к переменным.

Tanger ★★★★★
()

Его я нашел, вот код:

Вообще не надо так делать. В этот шаблон можно написать всё что угодно и оно будет выполнено. Это небезопасно.

Используй лучше envsubst. Он скорее всего везде есть.

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

eval «echo \»$template\«» > /tmp/config

С eval то понятно, а без него что будет?

Там будет выполнено то же

Плохое ты дал объяснение. Не?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

С eval то понятно, а без него что будет?

А такой вопрос был? Подстановок не будет. То же что и cat $template_file > $config

Плохое ты дал объяснение. Не?

Так дай хорошее. Не?

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

Ты хочешь, чтобы я написал

Изыди.

Мне казалось, что ТС понимает про то что такое подстановка переменных в shell

Нет. Именно это он и просил объяснить.

Deleted
()

Заранее спасибо.

Посмотри так же внизу страницы, под заголовком «Похожие темы».

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.